以下是我的收藏视图的示例:
mod.AppListView = Backbone.View.extend({
initialize: function() {
var self = this
mod.collection.bind('add', self.addOne);
mod.collection.bind('reset', self.addAll);
_.bindAll(self, 'addOne', 'addAll');
this.addAll();
},
events: {
},
addOne: function(myModel) {
var view = new ListItemView({
model: myModel
});
},
addAll: function() {
mod.collection.each(this.addOne);
},
});
在初次运行时,这很好用。但是在随后的重置中,addAll会成为集合而不是视图,因此addOne将无效。
为了解决这个问题,我必须这样做:
mod.collection.bind('reset', self.addAll, this);
但我认为那是_.bindAll的意思?难道不应该将此视为观点吗?这可以解释一下吗?有没有办法始终确保这指向视图而不是集合?
感谢。
答案 0 :(得分:5)
_.bindAll
必须在对方法的任何引用之前出现。你倒退了。
_.bindAll(self, 'addOne', 'addAll');
mod.collection.bind('add', self.addOne);
mod.collection.bind('reset', self.addAll);
当您调用_.bindAll
时,它会将您指定的方法替换为已包装/代理/修饰的方法,以确保始终正确设置上下文。由于正在替换该方法,因此必须在替换发生后对该方法进行任何引用。否则,引用将指向原始方法,_.bindAll
似乎无效。
至于_.bindAll
vs第三个参数...选择你喜欢的那个。我更喜欢在调用.bind
时传递第3个参数,但那只是我。但有些情况下我必须使用_.bindAll
。他们两个都做同样的事情,他们只是以不同的方式做到这一点。