我不得不替换默认的下划线teplating delimiters / Interpolate正则表达式以兼容asp.net webforms。从网站上我选择了胡须,如语法
_.templateSettings = {
interpolate : /\{\{(.+?)\}\}/g
};
尝试了这个
_.template("{{if(loggedIn)Welcome {{name}}}}",{name:"James",completed:true});
但似乎这不是使用模板系统检查布尔表达式的方式(因为发生错误)。但是从文档来看似乎是可能的
以及使用<%...%>
执行任意JavaScript代码
答案 0 :(得分:15)
您的问题是,您正在为<%= ... %>
定义一个Mustache风格的替代品,但尝试在通常使用<% ... %>
的地方使用它。来自fine manual:
定义插值正则表达式以匹配应逐字插值的表达式,转义正则表达式以匹配HTML转义后应插入的表达式,以及评估正则表达式以匹配应该在不插入结果字符串的情况下进行评估的表达式。
所以有三个正则表达式:
<%= ... %>
。<%- ... %>
。<% ... %>
。您告诉Underscore使用{{ ... }}
代替<%= ... %>
,然后您收到错误,因为无法插入if(loggedIn)
。您只需修复_.templateSettings
即可反映您要执行的操作:
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g
};
然后您的模板将如下所示:
{{ if(loggedIn) { }}Welcome {{= name }} {{ } }}
演示:http://jsfiddle.net/ambiguous/RwgVg/8/
您需要在模板中加入{
和}
,因为_.template
在编译模板时会添加分号,从而产生以下内容:
if(loggedIn) {; ...
(感谢JaredMcAteer指出这一点)。
您可能还想添加转义正则表达式,可能是/\{\{-(.+?)\}\}/g
。
答案 1 :(得分:2)
我相信这适用于过渡到胡子样式语法:
/**
* @configuration transform Underscore.js template syntax
* @description change the Ruby on Rails style syntax to the Mustache syntax
* @default <%= var %>
* @modified
* evaluate {{ JavaScript code}} execute arbitrary js code, such as loops
* interpolate {{= variable }} prints value of variables
* escape {{- variable }} this syntax will html escape variables
*/
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g,
escape: /\{\{-(.+?)\}\}/g
};
这将是胡须样式语法,但保留使用“=”和“ - ”的原始选项。不使用任何一个评估JS,例如for循环。可以交换它们,以便{{var}}是插值,评估可能是其他的,如果你愿意,可以保持模板更清晰,因为插值是最常用的。
答案 2 :(得分:0)
如果您没有覆盖Underscore.templateSettings.evaluate设置,您仍然可以使用<% ... %>
来评估代码。
我已经看到尝试定义Underscore.templateSettings.evaluate
设置以匹配Mustache语法,但是Mustache与模板评估打得非常强大,所以会很困难。