50

私はちょうどこのようなことをしたい:

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

5 に答える 5

92

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ビルトインは三項演算子として機能します。


于 2013-07-09T06:13:58.813 に答える
8

2.3.23 より前の古いバージョンの Freemarker を使用している場合は、三項演算を行う簡単な方法を提供するこのマクロを使用できます。

<#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> 

なんらかの理由で、名前のないパラメーターがブール式でない場合、括弧を追加することはできません。これにより、可読性がさらに向上する可能性があります。

于 2015-02-07T03:36:49.660 に答える
4

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>
于 2015-05-20T12:09:00.107 に答える
3

FreeMarker 2.3.23 以降では、 と書くことができますa?then('a.htm', 'b.htm')condition?then(whenTrue, whenFalse)overの利点はcondition?string(whenTrue, whenFalse)、文字列以外の and に対して機能することwhenTrueと、 and式whenFalseの 1 つだけを評価することです(どちらの分岐が選択されても)。whenTruewhenFalse

于 2015-07-05T17:19:14.350 に答える