如何使用Underscore.js和HAML插入if/else语句?

Bry*_*yan 5 haml interpolation ruby-on-rails underscore.js underscore.js-templating

我试图让if/else插入与Underscore.js和HAML一起使用,但无济于事.我已经将Underscore.js中的插值设置更改为以下内容:

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

当我尝试在{{value}}之类的符号中插入值时,这很有效.但是,我没有使if/else语句有效.我有以下内容:

{{ if (true) { }}
  {{ val }}
{{ } }}
Run Code Online (Sandbox Code Playgroud)

我得到一个Javascript异常"Uncaught SyntaxError:Unexpected token if".非常感谢帮助.

mu *_*ort 10

下划线模板使用三组不同的分隔符:

  1. evaluate:这是针对JavaScript的一些内容,<% ... %>默认情况下.
  2. interpolate:这是为了转储变量的内容,<%= ... %>默认情况下.
  3. escape:默认情况下interpolate,也可以转义HTML <%- ... %>.

这些大多匹配ERB语法.您尝试使用不是表达式的JavaScript的插值语法:

{{ if(true) { }}
Run Code Online (Sandbox Code Playgroud)

但这不会起作用,因为if它不是JavaScript中的表达.

您可能想要覆盖所有三种模式:

_.templateSettings = {
  evaluate    : /\{\{([\s\S]+?)\}\}/g,
  interpolate : /\{\{=([\s\S]+?)\}\}/g,
  escape      : /\{\{-([\s\S]+?)\}\}/g
};
Run Code Online (Sandbox Code Playgroud)

然后说出这样的话:

{{ if (true) { }}
  {{= val }}
{{ } }}
Run Code Online (Sandbox Code Playgroud)

如果您可以将模板限制为简单替换,那么您可以在模板中使用interpolate{{expr}}.