【问题标题】:How to propagate backbone stopListening to prevent memory leaks?如何传播主干停止监听以防止内存泄漏?
【发布时间】:2013-10-15 06:29:50
【问题描述】:

TLDR; 对于 Backbone 事件,有没有办法在事件对象没有更多侦听器时触发某些代码?

我有一个 Backbone Marionette View 来监听 Model A 上的更改事件。完成视图后,我调用view.close(),这会导致它停止侦听Model A 上的所有事件。如果这个模型没有被其他任何东西引用,它现在可以被垃圾收集。

但是我的问题是 Model A 正在监听 Model B 上的更改事件,而 Model B 又正在监听来自网络套接字的实时更新。

所以当Model A 停止监听Model B 时,它可以被释放,但Model B 仍将保留在内存中,因为web socket 有一个回调。添加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);
    }
});

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • Backbone 的模型扩展了 Events 类,因此 model B 已经有一个可以检查的回调列表。问题是知道何时检查该列表;因为Backbone.Events 中的off 函数不会触发callbackRemoved 事件。
    • 您必须扩展Backbone.Events' off 方法,并在 (1) 执行 off 方法和 (2) 列表包含 0 个条目时触发该触发器。为了注册该回调函数,您需要将其作为属性附加到 Backbone.EventsmodelB 都可以访问的内容。
    • 我有点希望有人已经扩展了 Backbone,但我已经创建了一个解决方案。 gist.github.com/DomBlack/6885740
    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2010-09-21
    • 2011-04-06
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多