2013-07-09 17 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

करने के लिए ईमानदारी से अधिक पठनीय हो सकता है क्योंकि यह बहुत ही पठनीय नहीं है क्योंकि इसका उद्देश्य इसका उपयोग नहीं है। यह बूलियन मूल्यों को स्वरूपित करने के लिए है, जैसे 'पंजीकृत: $ {पंजीकृत? स्ट्रिंग (' हां ',' नहीं ')} '। 2.3.23 के रूप में इस शर्त के लिए 'शर्त है? तब (जब ट्राउ, जब गलत) '। – 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> 

किसी कारण से आप गैर-बूलियन अभिव्यक्तियों के नामहीन पैरामीटर के आसपास कोष्ठक जोड़ नहीं सकते हैं। इससे पठनीयता में और भी वृद्धि हो सकती है।

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

समारोह किसी भी ${...} अभिव्यक्ति में इस्तेमाल किया जा सकता:

1

आप एक कस्टम समारोह if कि इतने की तरह घोषित किया जाता है परिभाषित कर सकते हैं। आपका कोड इस तरह दिखेगा:

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

@ केपप के विपरीत, मुझे लगता है कि आपको एक मैक्रो नहीं, एक समारोह का उपयोग करना चाहिए। मैक्रोज़ (टेक्स्टुअल) आउटपुट का उत्पादन करते हैं, जबकि फ़ंक्शन एक मान लौटाते हैं जो उदाहरण के लिए एक चर को असाइन किया जा सकता है, लेकिन आउटपुट को भी लिखा जा सकता है, इसलिए फ़ंक्शन का उपयोग करना अधिक लचीला है। इसके अलावा, फ़ंक्शन को लागू करने का तरीका एक टर्नरी ऑपरेटर का उपयोग करने के करीब है, जिसका उपयोग ${...} अभिव्यक्तियों के अंदर भी किया जाएगा, निर्देश के रूप में नहीं।

उदाहरण के लिए, यदि आप सशर्त लिंक लक्ष्य को कई बार की जरूरत है, यह समझ बनाने होगा एक स्थानीय चर निर्दिष्ट करने के लिए:

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

फ्रीमार्कर 2.3.23 के रूप में आप a?then('a.htm', 'b.htm') लिख सकते हैं। condition?then(whenTrue, whenFalse)condition?string(whenTrue, whenFalse) से अधिक का लाभ यह है कि यह गैर-स्ट्रिंग whenTrue और whenFalse के लिए काम करता है, और यह केवल whenTrue और whenFalse अभिव्यक्तियों (जो भी शाखा चुना जाता है) का मूल्यांकन करता है।

संबंधित मुद्दे