2013-07-09 156 views

回答

49

如果您使用的FreeMarker 2.3.23或更高版本,可以使用then內置:

<a href="${a?then('a.htm','b.html')}" target="${openTarget}"> 

如果您使用的freemarker的是舊版本,你可以使用,而不是建立在string式中:

<a href="${a?string('a.htm','b.html')}" target="${openTarget}"> 

當應用於布爾值,該string內置將作爲三元操作符。


+4

乍一看這並不明顯。我提高了答案,但是說實話,只要做一個'<#if>'和'<#else>' –

+0

就可以讀得更清楚了,因爲這不是它的預期用法。它用於格式化布爾值,如'Registered:$ {registered?string('yes','no')}'。從2.3.23開始,有條件嗎?那麼(whenTrue,whenFalse)'。 – ddekany

+0

@ddekany感謝您提供的信息,我更新了包含新解決方案的答案。 – obourgain

6

該宏提供一種更簡單的方式做三元操作:

<#macro if if then else=""><#if if>${then}<#else>${else}</#if></#macro> 

它易於使用,看起來不錯,相當的可讀性:

<@if someBoolean "yes" "no"/> 

需要注意的是@if - 而不是內置指令中的#if。這裏是一些更多的例子。

<!-- `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> 

由於某些原因,如果它們是非布爾表達式,不能在無名參數周圍添加括號。這可能會提高可讀性。

1

您可以自定義一個函數if即宣告像這樣:

<#function if cond then else=""> 
    <#if cond> 
    <#return then> 
    <#else> 
    <#return else> 
    </#if> 
</#function> 

功能可以在任何${...}表達式中使用。您的代碼看起來像這樣:

<a href="${if(a, 'a.htm', 'b.htm')}"> 

相反@kapep,我認爲你應該使用的函數,而不是宏。 宏產生(文本)輸出,而函數返回的值可以分配給變量,但也寫入輸出,因此使用函數更靈活。此外,應用函數的方法更接近於使用三元運算符,它也可用於${...}表達式中,而不是作爲指令使用。

例如,如果您需要有條件的鏈接目標多次,這將使意義將其分配到一個局部變量:

<#assign targetUrl=if(a, 'a.htm', 'b.htm')/> 
<a href="${targetUrl}">link 1</a> 
... 
<a href="${targetUrl}">link 2</a> 

使用功能,而不是宏觀的,@ kapep的例子會是什麼樣子這個:

<!-- `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> 
3

從FreeMarker 2.3.23開始,你可以寫a?then('a.htm', 'b.htm')condition?then(whenTrue, whenFalse)優於condition?string(whenTrue, whenFalse)的優點是它適用於非字符串whenTruewhenFalse,並且它僅評估whenTruewhenFalse表達式(無論哪個分支被選中)之一。