使用underscore.js的template
方法进入一些奇怪的行为:
var test = ['first', 'test'];
console.log(_.template('this is a <%= 1 %> ', test));
(小提琴:http://jsfiddle.net/adamb/mbD6E/)
此片段输出:“这是1”,而预期结果为“这是测试”。
不会抛出任何错误。我已经研究了source-code并且对这个结果没有明显的解释。我需要在模板中使用插值。我尝试使用_.extend({}, test)
将数组显式转换为集合,但没有骰子。
我怎样才能使这个工作?
答案 0 :(得分: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
答案 1 :(得分:1)
数字不是有效的javascript引用。
在这里你可能想这样写:<%= this[1] %>
。
如果这不起作用,则将数组传递给对象键:
_.template('this is a <%= list[1] %> ', { list: test })