在freemarker模板中转义#{{}}

时间:2017-02-14 12:33:56

标签: angularjs freemarker

我一起使用角度js和freemarker,在模板中我写了一个<a>标签href attr以#开头,所以我可以配置角度路由,例如:< / p>

<a href="#/edit/user">

但是在使用angularJS模板编写模板时,似乎存在一些冲突(将freemarker语法和angularJS模板语法结合在一起):

 <li ng-repeat="tab in tabs">
    <a href="#{{tab.url}}"> {{tab.title}} </a>
 </li> 

如果我上面写的那样,freemarker模板将无法解析此异常:

freemarker.core.ParseException: Parsing error in template "mis/newindex.ftl" in line 21, column 80:
Encountered "}", but was expecting one of:
    ","
    ":"
    "."
    "["
    "("
    "?"
    "!"
    <TERMINATING_EXCLAM>
    "??"
    "+"
    "-"
    "*"
    "/"
    "%"
    "!="
    "="
    "=="
    ">="
    <ESCAPED_GTE>
    ">"
    <ESCAPED_GT>
    <LESS_THAN_EQUALS>
    <LESS_THAN>
    ".."
    <AND>
    <OR>

我知道#{{tab.url}}应该是造成问题的原因之一,但我怎么能绕过这个问题呢?

我通过在角度控制器中添加一个方法来构建带有#前缀的网址

function completeUrl(url){
    return '#' + url;
}

<a href={{completeUrl(tab.url)}}> {{tab.title}} </a>

但是,我想找到一个更优雅的解决方案。

2 个答案:

答案 0 :(得分:2)

更新:自FreeMarker 2.3.28起,您可以将FreeMarker配置为仅使用${...},而不是#{...},方法是将interpolation_syntax配置设置为{{ 1}}(在Java API中:dollar)。然后Configuration cfg; ... cfg.setInterpolationSyntax(Configuration.DOLLAR_INTERPOLATION_SYNTAX)只是FreeMarker的静态文本。请勿将此设置与#{...}设置混淆。顺便说一句,也可以使用tag_syntax作为插值语法,以防[=...]也与某些东西发生冲突(比如ES6字符串插值)。另见:https://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html

这与FreeMarker的${...}发生了不幸的冲突,它甚至已被弃用,只是为了向后兼容性而被识别,但解析器无法配置为忽略它。我能想到的最短(即使是丑陋)的解决方案是#{}

答案 1 :(得分:0)

如果您的问题符合perl -MXML::LibXML -E 'say $_->to_literal for XML::LibXML->load_xml(location=>q{file.xml})->findnodes(q{/root/item/mediaList/media/URL})' 值,则可以使用href指令解决此问题。

代码应该是:

ngHref