我有View在集合上监听“添加”事件。当处理程序触发时,上下文是Collection,即使我使用_.bindAll()将其绑定到View。这是一个错误,还是我不明白这是如何工作的? jsfiddle
V = Backbone.View.extend({
initialize: function (options) {
this.collection.on('add', this.onAdd);
_.bindAll(this, 'onAdd');
},
onAdd: function () { console.log(this); }
});
c = new Backbone.Collection();
v = new V({collection:c});
c.add(new Backbone.Model());
输出:
e.Collection {length: 1, models: Array[1], _byId: Object, _events: Object, on: function…}
答案 0 :(得分:2)
在绑定到collection语句之前放置bindAll方法 这应该有效:
V = Backbone.View.extend({
initialize: function (options) {
_.bindAll(this, 'onAdd');
this.collection.on('add', this.onAdd);
},
onAdd: function () { console.log(this); }
});
<强>更新强> 通过在.on()方法中应用上下文,可以不使用_.bindAll方法
this.collection.on('add', this.onAdd, this);
答案 1 :(得分:0)
您的问题是,当您的呼叫this.collection.on('add', this.onAdd);
首先将事件绑定到onAdd
函数而没有上下文(此=触发时的集合)并且调用_.bindAll(this, 'onAdd');
时不会覆盖它
尝试更改顺序:
_.bindAll(this, 'onAdd');
this.collection.on('add', this.onAdd);