我正在开发一个Backbone应用程序。我创建了一个基本视图,它有一个destroy方法,所有其他视图都扩展它。
当销毁视图实例时,我想确保如果视图有模型或集合,我将解除它正在侦听的任何事件的绑定。
假设我在视图的初始化中使用了下划线的_.bindAll,那么关闭 下面的陈述删除了参考文献。
var DocumentRow = Backbone.View.extend({
initialize: function() {
_.bindAll( this );
this.model.on('change', this.render);
},
destroy : function() {
// Will this work?
this.model.off(null, null, this);
}
});
或者我是否需要显式绑定这样的事件
this.model.on('change', this.render, this);
答案 0 :(得分:3)
this.model.on('change', this.render);
将无法按您的方式运作。您需要将其更改为this.model.on('change', this.render, this);
如果您查看on
方法的来源(http://backbonejs.org/docs/backbone.html#section-18),则不会将您的context
变量默认为任何内容。因此,如果您未设置它,则对off
的调用将无法正确找到事件绑定。
FWIW,我厌倦了必须进行相应的on
和off
来电,所以我写了一个插件来为我处理很多内容:https://github.com/marionettejs/backbone.eventbinder
您可以像这样使用它,而不必担心获得正确的上下文或其他任何内容。
var DocumentRow = Backbone.View.extend({
initialize: function() {
this.eb = new Backbone.EventBinder();
this.eb.bindTo(this.model, 'change', this.render);
},
destroy : function() {
this.eb.unbindAll();
}
});
这样做的真正好处是不必为每个off
致电on
。您只需要对unbindAll
进行一次调用,它将取消绑定事件绑定器实例中存储的所有事件。