Freemarker:从JavaScript函数调用宏

时间:2013-11-04 19:25:21

标签: javascript freemarker

我有像这样的freemarker宏。

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

1 个答案:

答案 0 :(得分:2)

我假设您要将@util.createDropdown生成的HTML插入JavaScript字符串文字中。 (你不能从字面上称之为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字符串文字。