假设我有以下“课程”:
function Person( firstname, lastname ) {
this.attributes = {};
this.attributes.name = firstname + ' ' + lastname;
}
Person.prototype.name = function() {
return this.attributes.name;
};
当我将此对象传递给渲染器
时var myPerson = new Person( "Bob", "Robert" );
var template = Handlebars.compile( "<div>{{person.name}}</div>" );
var data = {person: myPerson, courseName: "LOG210"}
template( data );
问题是上面函数中的 this 关键字不再限定为Person实例。相反,它的范围是传递给Handlebars的数据。
例如,当把手调用 data.person.name()函数时, this.attributes.name this 变量的范围>是对象数据( {person:myPerson,courseName:“LOG210”} )而不是myPerson对象。
原因似乎在于把手-v1.3.0
// Template is only compiled on first use and cached after that point.
return function(context, options) {
if (!compiled) {
compiled = compileInput();
}
return compiled.call(this, context, options);
};
为什么范围已更改,是否有解决方法?
答案 0 :(得分:1)
车把不会假设您正在将原型传递给它。
Handlebars工作(并假设)您正在使用普通对象和帮助程序。解决方法是使用帮助器进行函数调用而不是直接函数调用(其中把手更改范围)。
辅助
Handlebars.registerHelper('ct', function(obj, fn) {
return obj[fn]();
});
模板
var template = Handlebars.compile( "<div>{{ct person 'name'}}</div>" );
这是工作小提琴http://jsfiddle.net/dp54p/