布尔检查下划线模板

Dee*_*ons 2 javascript templates boolean-logic underscore.js underscore.js-templating

我不得不替换默认的下划线teplating delimiters/Interpolate正则表达式以兼容asp.net webforms.从网站我选择了胡须,如语法

_.templateSettings = {
  interpolate : /\{\{(.+?)\}\}/g
};
Run Code Online (Sandbox Code Playgroud)

试过这个

_.template("{{if(loggedIn)Welcome {{name}}}}",{name:"James",completed:true});

但似乎这不是使用模板系统检查布尔表达式的方式(因为发生错误).但是从文档来看似乎是可能的

以及使用<%...%>执行任意JavaScript代码

  • 那么如何使用上面提到的插值执行任意js代码

mu *_*ort 15

您的问题是您正在定义一个Mustache风格的替代品,<%= ... %>但尝试在您通常使用的地方使用它<% ... %>.从精细手册:

定义一个插值正则表达式以匹配应该逐字插入的表达式,一个转义正则表达式匹配应该在HTML转义后插入的表达式,以及一个评估正则表达式来匹配应该在不插入结果字符串的情况下进行评估的表达式.

所以有三个正则表达式:

  1. 插值是为了<%= ... %>.
  2. 逃避是为了<%- ... %>.
  3. 评估是为了<% ... %>.

您告诉Underscore {{ ... }}代替使用,<%= ... %>然后您收到错误,因为if(loggedIn)无法插值.您只需要修复您的内容_.templateSettings以反映您要执行的操作:

_.templateSettings = {
    evaluate:    /\{\{(.+?)\}\}/g,
    interpolate: /\{\{=(.+?)\}\}/g
};
Run Code Online (Sandbox Code Playgroud)

然后你的模板看起来像这样:

{{ if(loggedIn) { }}Welcome {{= name }} {{ } }}
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/RwgVg/8/

您需要在模板中包含{},因为_.template在编译模板时添加分号,这会导致以下内容:

if(loggedIn) {; ...
Run Code Online (Sandbox Code Playgroud)

(感谢JaredMcAteer指出这一点).

您可能还想添加一个转义正则表达式,这可能是/\{\{-(.+?)\}\}/g.

  • 这可能是我能够找到的Underscore模板设置的最佳解释.他们网站的解释还有很多不足之处...... (5认同)