Backbone Cleanup - 删除上下文绑定回调的引用

时间:2012-11-19 10:56:29

标签: javascript backbone.js underscore.js

我正在开发一个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);

1 个答案:

答案 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,我厌倦了必须进行相应的onoff来电,所以我写了一个插件来为我处理很多内容: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进行一次调用,它将取消绑定事件绑定器实例中存储的所有事件。