1

TLDR;使用 Backbone 事件,当事件对象没有更多的侦听器时,有没有办法触发一些代码?

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

但是我的问题是Model A监听更改事件,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);
    }
});
4

1 回答 1

1

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

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

于 2013-10-08T11:25:28.680 回答