Unterschied zwischen ?? , has_content, if_exists in freemarker

73

Was ist der Unterschied zwischen den folgenden in Freemarker?

!
has_content
?? 
if_exists

Ich benutzte ?? anstelle von has_content & es führt zu so großen Problemen. Ich habe meinen Tag vermasselt. Ich muss das wirklich klären.

Als ich verwendet habe

!(xyz.abc!)?? -- it dint work

Als ich verwendet habe

!(xyz.abc!)?has_content ... it did work 

Nicht? ODER has_content ODER if_exists auf dasselbe prüfen?

user3606002
quelle

Antworten:

166

??Gibt an, ob der Wert des linken Operanden fehlt (dh es handelt sich um Java nulloder Sie haben dort eine undefinierte Variable), und gibt entsprechend zurück false(fehlt) oder true(fehlt nicht).

?has_contentist sehr ähnlich ??, außer dass es auch falsefür eine Zeichenfolge mit 0-Länge oder eine leere FTL-Sequenz (wie java.util.List, Java-Array usw.) oder einen leeren FTL-Hash (wie java.util.Mapusw.) zurückgegeben wird. (Es wird nicht falsefür a 0, boolean falseusw. zurückgegeben.)

!wird verwendet, um einen Standardwert anzugeben, wenn ein Wert fehlt (bedeutet wiederum, dass es sich um Java handelt nulloder Sie eine undefinierte Variable haben), wie z color!"no color". Wenn Sie die rechte Hand Operanden weglassen !, dann wird der Standardwert ist eine leere Zeichenfolge und leere Sequenz und leerer Hash auf die gleiche Zeit (ein Multi-typisierten Wert), die für das Schreiben Dinge praktisch ist , wie <#list things! as thing>, ${foo!}.

?if_existsist die alte Schreibweise ??. Benutze es nicht.

Beachten Sie, dass alle diese Operatoren nur den letzten Schritt eines Punkts oder []Ausdrucks abdecken , z. B. user.price!0nur Handles, wenn sie pricefehlen user, aber nicht, wenn sie userselbst fehlen. Um beide Möglichkeiten abzudecken, verwenden Sie (user.price)!0, die alle fehlenden variablen Fehler behandelt, die während der Auswertung der ausgelöst werden (), unabhängig davon, woher sie stammen.

ddekany
quelle
24
"gut dokumentierte" Anweisung verdient einige Links :) has_content , Standardwertoperator! , fehlender Wertestest ?? und alter Stil if_exists
coolersport
1
?has_contentist immer nützlich, außer Wert ist BooleanoderNumber 1/0 for yes/no
soytian
Wenn dieser Käufer nicht da ist <#elseif buyer.company?has_content >, gibt es eine undefinierte Ausnahme, wie man prüft, ob es einen Käufer gibt. Ich habe alles oben versucht!
Shareef
1
@shareef Wenn nur buyerfehlen kann, aber wenn es da ist, dann companyist es immer da, dann <#elseif buyer??>, sonst <#elseif (buyer.company)??>oder <#elseif (buyer.company)?has_content>. Das ()macht die Existenzhandler-Operatoren so, dass sie den gesamten Ausdruck abdecken.
Ddekany