2

任何人都知道为什么这不起作用?我正在尝试让 _.template 使用大括号。

    _.templateSettings = { //change delimiter to <$ $>
          interpolate : /\<\$(.+?)\$\>/g
        };      
    var list = "<$ _.each(people, function(name) { $> <li><$ name $> </li> <$ }); $>";
    var html=_.template(list);
    console.log(html({people : ['moe', 'curly', 'larry']}));

它在 )) 处产生以下语法错误错误:

((__t=( .each(people, function(name) { ))==null?'': _t)+

下面是下划线文档所说的:

如果 ERB 样式的分隔符不是您喜欢的,您可以更改 Underscore 的模板设置以使用不同的符号来衬托内插代码。定义一个插值正则表达式来匹配应该逐字插入的表达式,一个转义正则表达式来匹配应该在 HTML 转义后插入的表达式,以及一个评估正则表达式来匹配应该在不插入结果字符串的情况下计算的表达式。您可以定义或省略这三者的任意组合。例如,要执行 Mustache.js 样式模板:

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

var template = _.template("你好 {{ name }}!"); 模板({名称:“小胡子”});=> “你好小胡子!”

4

1 回答 1

9

您的问题是插值的东西应该产生一个独立的 JavaScript 表达式,并且:

_.each(people, function(name) {

不是一个有效的表达式。您需要定义单独的评估插值正则表达式,然后将评估用于_.each; 像这样的东西:

_.templateSettings = {
    interpolate: /\{\{=(.+?)\}\}/g,
    evaluate: /\{\{(.+?)\}\}/g,
};
var list = "{{_.each(people, function(name) {}} <li>{{=name}}</li> {{ }); }}";

请注意,插值现在使用{{= ... }}并且{{ ... }}仅用于评估(或嵌入)小的 JavaScript 片段。

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

于 2013-07-04T05:06:10.930 回答