0

このようなフリーマーカーマクロがあります。

<#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.createDropdownJavaScript 文字列リテラルに挿入するとします。(この 2 つは異なる時間に実行されるため、文字通り 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 に答える