10

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

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g;

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

<div><%= title %> | {{ title }}</div>

我在浏览器中得到以下信息:

Correct title | {{ title }}

所以看起来标准的下划线模板设置正在工作,而车把样式的设置被忽略了:

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

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

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

4

1 回答 1

18

当我这样做时:

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

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

SyntaxError: 意外的标记 '='

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

/<%([\s\S]+?)%>/g

<%= ... %>与您在模板中的匹配。等号匹配\S,因此评估正则表达式当然会找到<%= ... %>,去掉<%and ,并在尝试构建%>的 JavaScript 中留下语法错误。_.template

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

  1. escape
  2. interpolate
  3. evaluate

所以只是替换interpolate会让<%= ... %>事情被抓住(和误解)但是evaluate

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

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

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

于 2013-03-25T21:49:28.843 回答