如何传播骨干stopListening以防止内存泄漏?

时间:2013-10-08 10:59:47

标签: javascript backbone.js memory-leaks marionette backbone-events

TLDR; 使用Backbone事件,当事件对象没有更多侦听器时,是否可以触发某些代码?

我有一个Backbone Marionette View在Model A上听取更改事件。当我完成视图后,我会调用view.close(),这会导致它停止收听Model A上的所有事件。如果此模型未被其他任何内容引用,则现在可以对其进行垃圾回收。

但是我的问题是Model A正在监听Model B上的更改事件,而这些更改事件又是从Web套接字侦听实时更新。

因此当Model A停止收听Model B时,它可以被释放,但由于网络套接字有回调,Model B仍将保留在内存中。添加modelB.close()方法不一定有效,因为其他对象可能仍在使用Model B。但是如果没有其他对象正在使用Model B的那个实例,那么我希望它触发它的stopListening方法,这样就可以让网络套接字知道它可以在没有任何内容收听时关闭更多。

修改 解决方案基于答案; https://gist.github.com/DomBlack/6885740 使用示例;

var BackboneExt = require('/path/to/gist');

var modelB = Backbone.Model.extend({
    initialize: function() {
        BackboneExt.autoCleanup(this);
    }
});

1 个答案:

答案 0 :(得分:1)

所有EventAggregators都以这样的方式实现,即某人拥有将在某些“事件”中执行的回调函数列表。如果一个对象公开了EventAggregator API,那么它就会有效地提供一个列表,任何人都可以在其中写下它的名称和电子邮件,以及您希望何时以及如何联系的原因。通常,您不仅需要递交清单和笔,还需要填写注册表格,然后由第三方处理,如果您通过了所有验证标准,您将被列入该清单由第三人。如果您想取消订阅该列表,也一样。

现在,谁有这个名单?好吧,任何提供自己的EventAggrigator API的人都有这样的列表。因此,如果您的modelB向其他模块提供EventAggregator API,则意味着它具有包含所有订阅者的列表。如果该列表应为空,哪个modelB可以检查,它可以去告诉其他人,例如你的websocket模块。