下划线插值设置

jam*_*day 10 underscore.js underscore.js-templating

我正试图在主干中使用带有下划线的把手样式模板(使用require.js).我有以下内容:

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

在我的模板中,我设置了一个测试:

<div><%= title %> | {{ title }}</div>
Run Code Online (Sandbox Code Playgroud)

我在浏览器中获得以下内容:

Correct title | {{ title }}
Run Code Online (Sandbox Code Playgroud)

因此看起来标准的下划线模板设置正在运行,并且把手样式设置被忽略:

但是,如果我在Chrome中检查控制台,我会得到这个(我觉得它应该是正确的)

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

任何想法为什么这不能正常工作?

mu *_*ort 16

当我这样做:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;
var t = _.template($('#t').html());
Run Code Online (Sandbox Code Playgroud)

使用您的模板#t,我收到一个错误:

SyntaxError:意外的标记'='

这很好地证实了我怀疑评估正则表达式:

/<%([\s\S]+?)%>/g
Run Code Online (Sandbox Code Playgroud)

<%= ... %>在模板中匹配您的.等号符合匹配,\S因此评估正则表达式会找到<%= ... %>,剥离<%%>,并在JavaScript中_.template尝试构建语法错误.

如果查看_.template源代码,您将看到以特定顺序检查正则表达式:

  1. escape
  2. interpolate
  3. evaluate

因此,只是替换interpolate会让<%= ... %>事情陷入陷阱(并被误解)但是evaluate.

您需要做的就是替换evaluate正则表达式.我建议更换所有三个正则表达式以避免出现问题:

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

演示:http://jsfiddle.net/ambiguous/SdLsn/