Render_template使用带/数字键的对象

时间:2013-11-06 19:35:35

标签: javascript underscore.js

使用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)将数组显式转换为集合,但没有骰子。

我怎样才能使这个工作?

2 个答案:

答案 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 })