0

我有一个这样的 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.
4

1 回答 1

2

我假设您想将生成的 HTML 插入@util.createDropdown到 JavaScript 字符串文字中。(你不能从 JavaScript 中直接调用 FreeMarker,因为两者在不同的时间运行。)天真的方法只是:

<#-- 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 字符串文字。

于 2013-11-04T21:01:14.523 回答