2012-07-05 42 views
2

我想使用Backbone.js進行一些事件處理,但我對循環引用&內存管理沒有信心。比方說,我有一個名爲EventStation一些靜態事件源 - 所以,在腳本我說的開始:Backbone.js事件和內存管理

var source = new EventSource(); 

source是爲了活頁的使用壽命,這很好。現在,我也有一個事件消費者:

var EventConsumer = Backbone.Model.extend({ 
    initialize: function(params) { 
     source.on("some_event",this.onSomeEvent,this); 
    } 
}); 

function later() { 
    var consumer = new EventConsumer(); 

    // consumer now gets leaked... (I think) 
} 

我打電話later()在某些時候 - 並在年底,我不再有任何消費者訪問,除非我去通過source的內部周圍挖。我想我需要一些新的功能添加到EventConsumer,像

cleanup: function() { 
    source.off("some_event",this.onSomeEvent,this); 
} 

然後調用在later()結束。

這似乎......並不像我想要的那麼幹淨。有什麼方法可以做得更好嗎?如果我使用DOM事件,這會處理不同嗎?

回答

5

閱讀:

http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/

雖然具體談看法,它適用於任何事件綁定對象。

而且這樣的:

Backbone.js : repopulate or recreate the view?

約翰尼大鹿的管理事件綁定和解除綁定與他的「bindTo」方法和「unbindAll」方法的想法是輝煌。我強烈建議在管理你的事件的對象中使用這些方法。

如果你想這樣的一個實現,我把它建在我的Backbone.Marionette框架,在這裏:

https://github.com/derickbailey/backbone.marionette/blob/master/src/backbone.marionette.bindto.js

此代碼是MIT許可開源的,所以你可以自由地複製它並在任何你想要的地方使用它......沒有必要使用Marionette來獲得這個功能。

要使用BindTo對象,你在你自己的對象範圍擴大:


var source = _.extend({}, Backbone.Marionette.BindTo); 

或使用它作爲原型:


var source = Object.create(Backbone.Marionette.BindTo); 

然後綁定事件傳遞事件源爲第一參數,與所有標準主幹事件之後的參數:


source.bindTo(myObj, "some_event", this.doStuff, this); 

並且解除每一個NG,


source.unbindAll(); 

文檔爲我實現可以在這裏找到:

https://github.com/derickbailey/backbone.marionette/blob/master/docs/marionette.bindto.md

+0

不夠公平 - 我想這將不得不這樣做。 – Daniel 2012-07-06 16:39:06