2012-07-05 53 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