我有像这样的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.
答案 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字符串文字。