TLDR;对于 Backbone 事件,有没有办法在事件对象没有更多监听器时触发一些代码?
我有一个 Backbone Marionette View 正在监听 Model A
上的更改事件。完成 View 后,我调用 view.close()
这会导致它停止监听 Model A
上的所有事件。如果这个模型没有被其他任何东西引用,它现在可以被垃圾收集。
但是我的问题是 Model A
正在监听 Model B
上的更改事件,而 Model B
又监听来自 Web 套接字的实时更新。
因此,当Model A
停止监听Model B
时,它可以被释放,但Model B
仍会保留在内存中,因为具有回调的 Web 套接字。添加 modelB.close()
方法不一定有效,因为其他对象可能仍在使用 Model B
。但是,如果没有其他对象正在使用 Model B 的该实例,那么我希望它触发它的 stopListening 方法,然后该方法又会让 Web 套接字知道它可以当没有人再听它时关闭。
编辑: 基于答案的解决方案; https://gist.github.com/DomBlack/6885740 使用示例;
var BackboneExt = require('/path/to/gist');
var modelB = Backbone.Model.extend({
initialize: function() {
BackboneExt.autoCleanup(this);
}
});
最佳答案
所有EventAggregators都是以这样的方式实现的,即某人拥有要在某些“事件”中执行的回调函数列表。如果一个对象公开了一个 EventAggregator API,这意味着它有效地提供了一个列表,任何人都可以在其中写入其姓名、电子邮件以及您想要联系的时间和方式的原因。通常,您不仅会收到 list 和笔,还需要填写一份登记表,然后由第三方处理,如果您通过了所有验证标准,您将被列入该 list 由第三人。如果您想从该列表中退订,也同样如此。
现在,谁有这份 list ?好吧,任何提供自己的 EventAggrigator API 的人都有这样的列表。因此,如果您的 modelB 向其他模块提供 EventAggregator API,则意味着它拥有包含所有订阅者的列表。如果该列表应该为空,则 modelB 可以检查哪个列表,它可以告诉其他人,例如你的 websocket 模块。
关于javascript - 如何传播主干 stopListening 以防止内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19245918/