为什么Handlebars会改变我们传递给它的数据的范围?

时间:2014-02-24 16:14:48

标签: javascript scope this handlebars.js

假设我有以下“课程”:

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);
};

为什么范围已更改,是否有解决方法?

1 个答案:

答案 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/