TLDR;有了Backbone事件,有沒有辦法在事件對象沒有更多的偵聽器時觸發一些代碼?如何傳播主幹stopListening以防止內存泄漏?
我有一個Backbone Marionette查看在Model A
上收聽更改活動。當我完成視圖後,我打電話view.close()
,導致它停止收聽Model A
上的所有事件。如果這個模型沒有被別的東西引用,它現在可以被垃圾收集。
但是我的問題是Model A
正在監聽Model B
上的更改事件,而這些事件正在監聽來自Web套接字的實時更新。
因此,當Model A
停止收聽Model B
,它可以被釋放,但Model B
仍將保留在內存中,由於網絡套接字具有回調。添加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);
}
});
骨幹的模型擴展了Events類,因此這個'B模型'已經有一個可以檢查的回調列表。問題是知道何時檢查該列表;因爲Backbone.Events中的'off'函數不會觸發'callbackRemoved'事件。 – Phenix
你必須用(1)'off'方法執行時引發的觸發器來擴展'Backbone.Events''' off'方法,並且(2)該列表包含0個條目。爲了註冊該回調函數,您需要將它作爲屬性附加到'Backbone.Events'和'modelB'都可以訪問的內容。 –
我有點希望有人已經擴展了Backbone,但我已經創建了一個解決方案。 https://gist.github.com/DomBlack/6885740 – Phenix