Backbone.js事件和内存管理

时间:2012-07-05 23:52:14

标签: javascript backbone.js

我想使用Backbone.js进行一些事件处理,但我对周期性参考和放大器没有信心。内存管理。假设我有一些名为EventStation的静态事件源 - 所以,在脚本开头我说:

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事件,这会有不同的处理吗?

1 个答案:

答案 0 :(得分:5)

阅读本文:

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

虽然它专门讨论了视图,但它适用于任何事件绑定对象。

还有:

Backbone.js : repopulate or recreate the view?

Johnny Oshika用管理事件绑定和解绑他的“bindTo”方法和“unbindAll”方法的想法非常棒。我强烈建议您在管理事件的对象中使用这些方法。

如果你想要实现这个,我将它内置到我的Backbone.Marionette框架中,在这里:

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

此代码是麻省理工学院授权的开源代码,因此您可以随意复制并在任何地方使用它......不需要使用Marionette来获得此功能。

要使用BindTo对象,请将其扩展到您自己的对象:


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

或将其用作原型:


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

然后将传递事件源的事件绑定为第一个参数,然后将所有标准的Backbone事件args绑定:


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

并解开一切,


source.unbindAll();

我的实施文档可以在这里找到:

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

相关问题