2

我想使用 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 事件,这会有所不同吗?

4

1 回答 1

5

读这个:

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

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

还有这个:

Backbone.js:重新填充或重新创建视图?

Johnny Oshika 用他的“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);

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


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

并解开一切,


source.unbindAll();

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

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

于 2012-07-06T01:51:30.240 回答