2013-11-04 77 views
0

我有一個像這樣的freemarker宏。Freemarker:從JavaScript函數調用宏

<#assign xmlNode = parseXML("<field name='dropDown' type='select' valueName='COUNTRY'/>")>; 
    <#import "utilFields.ftl" as util /> 
    <div> 
     <@util.createDropdown field=xmlNode/> 
    </div> 

如何從Javascript中調用相同的宏?
嘗試:

<#assign xmlNode = parseXML("<field name='dropDown' type='select' valueName='COUNTRY'/>")>; 
<script type="text/javascript"> 
     var dropdown = "${util.createDropdown(xmlNode)}"; 
     alert(dropdown); 
</script> 

錯誤

FreeMarker template error: 
A macro cannot be called in an expression. 

回答

2

我假設你要插入的@util.createDropdown生成到JavaScript字符串字面的HTML。 (你不能隨便叫的FreeMarker形成的JavaScript,因爲在不同的時間在兩個運行)的幼稚的做法就是:

<#-- Not safe! --> 
var dropdown = "<@util.createDropdown field=xmlNode/>"; 

的問題是,util.createDropdown寫入HTML的輸出,一般有效的HTML不就像在JavaScript字符串文字裏面一樣,因爲你可以有"等等。你可以做一個把戲這樣雖然:

<#macro jsStr> 
    <#local captured><#nested></#local> 
    "${captured?js_string}"<#t> 
</#macro> 

... 

var dropdown = <@jsStr><@util.createDropdown field=xmlNode/></@>; 

jsStr宏印它裏面的內容轉換(它不一定是一個宏調用它裏面,它可以是任何東西),以有效的JavaScript字符串文字。

+0

謝謝@ddekany。這真棒。 –