1

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); 
    } 
}); 

回答

1

所有EventAggregators都以這樣的方式實現,即某人擁有將在特定「事件」中執行的回調函數列表。如果一個對象暴露了一個EventAggregator API,這意味着它實際上提供了一個列表,任何人都可以寫出它的名字和電子郵件,以及何時和如何聯繫您的原因。通常情況下,你不只是遞交清單和一支筆,而是你需要填寫一份登記表,然後由第三方處理,如果你通過了所有的審定標準,你將被放入該清單由第三人稱。如果您想從列表中取消訂閱,也是一樣。

現在,誰擁有這個列表?那麼任何提供它自己的EventAggrigator API的人都有這樣的列表。因此,如果您的modelB向其他模塊提供EventAggregator API,則意味着它擁有所有訂閱者的列表。如果該列表應該是空的,哪個模型B可以檢查,它可以去告訴其他人,例如,你的websocket模塊。

+0

骨幹的模型擴展了Events類,因此這個'B模型'已經有一個可以檢查的回調列表。問題是知道何時檢查該列表;因爲Backbone.Events中的'off'函數不會觸發'callbackRemoved'事件。 – Phenix

+1

你必須用(1)'off'方法執行時引發的觸發器來擴展'Backbone.Events''' off'方法,並且(2)該列表包含0個條目。爲了註冊該回調函數,您需要將它作爲屬性附加到'Backbone.Events'和'modelB'都可以訪問的內容。 –

+1

我有點希望有人已經擴展了Backbone,但我已經創建了一個解決方案。 https://gist.github.com/DomBlack/6885740 – Phenix

相關問題