我想使用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事件,这会有不同的处理吗?
答案 0 :(得分:5)
阅读本文:
虽然它专门讨论了视图,但它适用于任何事件绑定对象。
还有:
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