po prostu chcę to zrobić tak:Używaj potrójnego operatora w freemarker?
<a href="${ a? 'a.htm' : 'b.htm'}">
pozdrawiam.
po prostu chcę to zrobić tak:Używaj potrójnego operatora w freemarker?
<a href="${ a? 'a.htm' : 'b.htm'}">
pozdrawiam.
Jeśli używasz freemarker 2.3.23 lub nowszy, można użyć then
wbudowanej:
<a href="${a?then('a.htm','b.html')}" target="${openTarget}">
Jeśli używasz starszej wersji freemarker, można użyć zamiast tego string
wbudowany -W:
<a href="${a?string('a.htm','b.html')}" target="${openTarget}">
Kiedy nakłada się na logiczną, taką string
wbudowaną będzie pełnić funkcję operatora potrójnego.
Na pierwszy rzut oka nie jest tak oczywiste, co to oznacza. Przegłosowałem odpowiedź, ale szczerze mówiąc, może być bardziej czytelny po prostu "<#if>" i "<#else>" –
Nie jest to bardzo czytelne, ponieważ nie jest to zamierzone użycie. Służy do formatowania wartości logicznych, takich jak 'Registered: $ {registered? String ('yes', 'no')}'. Od wersji 2.3.23 istnieje "warunek? Wtedy (gdy" Prawda, kiedy "). – ddekany
@ddekany Dzięki za informację, zaktualizowałem odpowiedź, aby uwzględnić nowe rozwiązanie. – obourgain
Makro to zapewnia bardziej bezpośredni sposób do zrobienia operacji trójskładnikowych:
<#macro if if then else=""><#if if>${then}<#else>${else}</#if></#macro>
Jest łatwy w użyciu i wygląda ładnie i dość czytelna:
<@if someBoolean "yes" "no"/>
Należy pamiętać, że jest to @if
- a nie #if
jak w dyrektywie wbudowanej. Oto kilka przykładów.
<!-- `else` is optional -->
<@if someBoolean "someBoolean is true"/>
<!-- expressions -->
<@if (someBoolean||otherBoolean) "hello,"+user.name 1+2+3 />
<!-- with parameter names -->
<@if someBoolean then="yes" else="no" />
<!-- first in list? -->
<#list seq as x>
<@if (x_index==0) "first" "not first"/>
<#list>
Z jakiegoś powodu nie możesz dodać nawiasów wokół parametrów bezimiennych, jeśli są one wyrażenia non-logiczne. To mogłoby jeszcze bardziej zwiększyć czytelność.
Można zdefiniować niestandardową funkcję if
deklarowaną tak:
<#function if cond then else="">
<#if cond>
<#return then>
<#else>
<#return else>
</#if>
</#function>
Funkcja ta może być używana w dowolnym wyrażeniu ${...}
. Twój kod będzie wyglądać tak:
<a href="${if(a, 'a.htm', 'b.htm')}">
W przeciwieństwie do @kapep, myślę, że należy użyć funkcji, a nie makro. Makra wytwarzają (tekstowe) dane wyjściowe, podczas gdy funkcje zwracają wartość, którą można na przykład przypisać do zmiennej, ale także zapisać na wyjście, więc użycie funkcji jest bardziej elastyczne. Ponadto sposób zastosowania tej funkcji jest znacznie bliższy użyciu operatora trójskładnikowego, który byłby również używany w wyrażeniach ${...}
, a nie jako dyrektywa.
Na przykład, jeśli potrzebujesz warunkowego cel połączyć wiele razy, to jest sens, aby przypisać ją do zmiennej lokalnej:
<#assign targetUrl=if(a, 'a.htm', 'b.htm')/>
<a href="${targetUrl}">link 1</a>
...
<a href="${targetUrl}">link 2</a>
Korzystanie z funkcji zamiast makra, przykłady @ kapep byłby wyglądać to:
<!-- `else` is optional -->
${if(someBoolean, "someBoolean is true")}
<!-- expressions -->
${if(someBoolean||otherBoolean, "hello,"+user.name, 1+2+3)}
<!-- with parameter names: not possible with functions,
but also not really helpful -->
<!-- first in list? -->
<#list seq as x>
${if(x_index==0, "first", "not first")}
<#list>
Od wersji FreeMarker 2.3.23 można pisać: a?then('a.htm', 'b.htm')
. Zaletą condition?then(whenTrue, whenFalse)
nad condition?string(whenTrue, whenFalse)
jest to, że pracuje non-string whenTrue
i whenFalse
, i że tylko ocenia jeden z whenTrue
i whenFalse
wyrażeń (którykolwiek oddział wyboru).
Spróbuj var url = (a? A.htm: b.htm) .............. –
Jak powiedział obourgain, możesz użyć '? string', ale jaka jest dokładnie wartość' a'? A czy chcesz przetestować, czy istnieje, czy jest boolean 'true'? – ddekany