【问题标题】:Freemarker: Calling macro from JavaScript functionFreemarker:从 JavaScript 函数调用宏
【发布时间】:2013-11-04 19:25:20
【问题描述】:

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

【问题讨论】:

    标签: javascript freemarker


    【解决方案1】:

    我假设您想将@util.createDropdown 生成的 HTML 插入到 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 字符串文字。

    【讨论】:

    • 谢谢@ddekany。这太棒了。
    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多