2012-11-19 42 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