2013-07-09 31 views
28

私はちょうどこのようにそれをしたい:freemarkerで三項演算子を使用しますか?

<a href="${ a? 'a.htm' : 'b.htm'}"> 

よろしく。あなたはFreeMarkerの2.3.23以降を使用している場合

答えて

49

は、あなたが使用することができますthenビルトイン:

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

あなたはFreeMarkerの古いバージョンを使用している場合は、あなたの代わりに建てstringを使用することができます-in:ブール値に適用された場合

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

、ビルトインstringは三項演算子として機能します。


+4

これが何をしているのかは一目瞭然ではありません。私は答えをアップウィニングしましたが、正直なところ、「<#if>」と「<#else>」 –

+0

を読むだけで読めるようになるかもしれません。これは、 'Registered:$ {registered?string( 'yes'、 'no')}'のようなブール値をフォーマットするためのものです。 2.3.23から、このために '条件?then(True、whenFalse)'があります。 – ddekany

+0

@ddekany情報をお寄せいただき、ありがとうございました。新しいソリューションを含めるように答えを更新しました。 – obourgain

6

このマクロは、三元の操作を行うには、より簡単な方法を提供します:

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

それは使いやすいですし、素敵な、非常に読みやすいです:それは@ifであること

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

注 - 組み込み指令のように#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> 

何らかの理由で、名前のないパラメータが括弧でない式である場合は、括弧を追加できません。これにより、読みやすさがさらに向上しました。

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

機能がどの${...}式で使用することができます。

1

あなたがそうのように宣言されているカスタム関数ifを定義することができます。あなたのコードは次のようになります:

<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

から、a?then('a.htm', 'b.htm')と書くことができます。 condition?then(whenTrue, whenFalse)の利点がcondition?string(whenTrue, whenFalse)を超えているのは、非文字列whenTruewhenFalseで動作し、whenTruewhenFalseのいずれかの式(いずれかの分岐が選択されている)のいずれかのみを評価するということです。

関連する問題