0

使用 underscore.js 的template方法遇到了一些奇怪的行为:

var test = ['first', 'test'];
console.log(_.template('this is a <%= 1 %> ', test));

(小提琴:http: //jsfiddle.net/adamb/mbD6E/

此片段输出:"this is a 1",而预期结果是"this is a test"

没有错误被抛出。我研究了源代码,对此结果没有明显的解释。我只在我的模板中使用插值。我尝试使用 将数组显式转换为集合_.extend({}, test),但没有骰子。

我怎样才能得到这个工作?

4

2 回答 2

3

您可以使用以下命令检查编译的模板代码:

_.template('this is a <%= 1 %> ').source

这给出了这个功能:

function(obj){
var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};
with(obj||{}){
__p+='this is a '+
( 1 )+
' ';
}
return __p;
}

关键部分是:

with(obj){
  (1)
}

因为 1 不是有效的属性/变量名称,它不会尝试匹配您正在模板化的对象的属性,所以只打印出“1”。

如果您要使用类似的对象{zero: 'first', one: 'test'}和 的模板'this is a <%= one %> ',则如下所示:

with(obj){
  (one)
}

这是一种等价物obj.one

于 2013-11-06T19:59:57.727 回答
1

数字不是有效的 javascript 引用。

在这里你可能想这样写:<%= this[1] %>.

如果这不起作用,则将您的数组传递给对象键:

_.template('this is a <%= list[1] %> ', { list: test })
于 2013-11-06T19:53:05.703 回答