0

我正在开发一个 Backbone 应用程序。我创建了具有销毁方法的基本视图,所有其他视图都对其进行了扩展。

销毁视图实例时,我想确保如果视图具有模型或集合,我将解除绑定它正在侦听的任何事件。

假设我在视图的初始化中使用下划线的 _.bindAll,下面的 off 语句是否会删除引用。

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

1 回答 1

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,它就会取消绑定存储在事件绑定器实例中的所有事件。

于 2012-11-19T14:22:38.933 回答