2012-11-19 30 views
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); 
+0

为什么你将null传递给model.off? –

+0

删除视图中的所有回调。根据Backbone文档中的示例://为所有事件移除“context”的所有回调。 object.off(null,null,context); – Daniel

+0

好的。我认为this.model.on('改变',this.render);应该可以正常工作,因为渲染将被绑定到'This',您的DocumentRow。 –

回答

3

this.model.on('change', this.render);将无法​​正常工作,你所希望的方式。你需要如果你看看来源为on方法(http://backbonejs.org/docs/backbone.html#section-18)它不是你的context变量默认为任何将其更改为this.model.on('change', this.render, this);

。所以如果你没有设置它,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一个电话,它将取消绑定存储在事件绑定器实例中的所有事件。

+0

谢谢,我会检查eventBinder插件 – Daniel