使用带有javascript的自由标记ES6模板字符串

时间:2017-05-11 05:29:42

标签: javascript freemarker template-engine

Freemaker模板使用以下语法呈现变量:$ {name}

Javascript ES6模板字符串具有类似的语法$ {name}

问题在于,当freemarker在服务器上运行时,它会尝试在javascript代码中呈现模板,因为Freemarker认为它遇到了一个变量(实际上它是一个javascript模板,应该在客户)。关于如何处理这个问题的推荐?

一种方法是将所有JS包装在freemarker注释中(因此永远不会对其进行评估),

或将JS代码放在一个单独的文件中(不在html页面中内联),以便它永远不会被freemarker评估。

2 个答案:

答案 0 :(得分:1)

更新:自FreeMarker 2.3.28起,您可以将[=exp]配置设置为{{1},将FreeMarker配置为使用${exp}而不是interpolation_syntax (在Java API中:square_bracket)。然后Configuration cfg; ... cfg.setInterpolationSyntax(Configuration.SQUARE_BRACKET_INTERPOLATION_SYNTAX)只是FreeMarker的静态文本。不要将此设置与${exp}设置混淆,tag_syntax设置也可以具有square_bracket值,但与插值语法无关(但您可能更喜欢将两者都设置为square_bracket)。另见:https://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html

过时回答:遗憾的是,FreeMarker的语法不可配置(我假设也不是ES6模板语法)。因为那将是真正的解决方案,将其配置为使用其他内容而不是$。您可以使用自定义TemplateLoader实施创建一个穷人的实现,该实现仅委托给另一个TemplateLoader,但它会向其返回的Reader添加一个过滤器,并随之修改即时模板。它会将${ - s替换为$<#-- -->{,将@{ - s替换为${。那么您的原始模板就像${forES6} @{forFM}。这有一些缺点,比如FreeMarker错误位置中的列号将被取代,Eclipse插件和其他一些工具将无法工作。

答案 1 :(得分:1)

你可以在noparse标签中使用javascripts

 <#noparse>...</#noparse>

const name = "WORLD";
Hello ${r"${name}"}

html视图“Hello $ {name}”输出 - &gt; Hello WORLD