私はちょうどこのようにそれをしたい:freemarkerで三項演算子を使用しますか?
<a href="${ a? 'a.htm' : 'b.htm'}">
よろしく。あなたはFreeMarkerの2.3.23以降を使用している場合
私はちょうどこのようにそれをしたい:freemarkerで三項演算子を使用しますか?
<a href="${ a? 'a.htm' : 'b.htm'}">
よろしく。あなたはFreeMarkerの2.3.23以降を使用している場合
は、あなたが使用することができます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
は三項演算子として機能します。
これが何をしているのかは一目瞭然ではありません。私は答えをアップウィニングしましたが、正直なところ、「<#if>」と「<#else>」 –
を読むだけで読めるようになるかもしれません。これは、 'Registered:$ {registered?string( 'yes'、 'no')}'のようなブール値をフォーマットするためのものです。 2.3.23から、このために '条件?then(True、whenFalse)'があります。 – ddekany
@ddekany情報をお寄せいただき、ありがとうございました。新しいソリューションを含めるように答えを更新しました。 – obourgain
このマクロは、三元の操作を行うには、より簡単な方法を提供します:
<#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>
機能がどの${...}
式で使用することができます。
あなたがそうのように宣言されているカスタム関数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>
から、a?then('a.htm', 'b.htm')
と書くことができます。 condition?then(whenTrue, whenFalse)
の利点がcondition?string(whenTrue, whenFalse)
を超えているのは、非文字列whenTrue
とwhenFalse
で動作し、whenTrue
とwhenFalse
のいずれかの式(いずれかの分岐が選択されている)のいずれかのみを評価するということです。
試してくださいvar url =(a?a.htm:b.htm).............. –
obourgainは以下のように '?string'を使うことができますが、正確に' a'の値は何ですか?それが存在するかどうか、または真偽が真であるかどうかをテストしたいですか? – ddekany