2016-05-13 73 views
3

我的Backbone Marionette應用程序中存在問題,我的子視圖未完全銷燬。你如何正確地銷燬你用另一個佈局/項目視圖替換的嵌套佈局視圖?Backbone Marionette - 佈局查看殭屍

我在Marionette documentation on destroying layout views的印象下,當我設置一個區域來顯示一個新視圖時,舊視圖被破壞。但是,通過排氣口觸發的事件仍然可以被舊的視圖看到,而這個舊視圖據說已被銷燬。

我創造了這個問題,在這裏的一個示例:https://jsfiddle.net/dhardin/5j3x2unx/

我相信這個問題從我的路由器莖:

App.Router = Marionette.AppRouter.extend({ 
    routes: { 
    '': 'showView1', 
    'view1': 'showView1', 
    'view2': 'showView2' 

    }, 
    showView1: function() { 
    var view1 = new App.View1(); 
    App.Layout.mainRegion.empty(); 
    App.Layout.mainRegion.show(view1); 
    }, 
    showView2: function() { 
    var view2 = new App.View2(); 
    App.Layout.mainRegion.empty(); 
    App.Layout.mainRegion.show(view2); 
    } 
}); 

App.Layout.mainRegion.empty()不需要我的理解是視圖在區域管理器的show()函數中銷燬視圖時的處理。 要查看該問題,請通過導航導航到另一個視圖,然後單擊該按鈕。您將看到,舊視圖和新視圖都會觸發警報。

回到我的前木偶應用程序中,我遵循清理模式以避免討論here這些內存泄漏。

從本質上講,我顯示的視圖會調用下面的函數,當我的應用程序更改爲一個新的觀點:

Backbone.View.prototype.close = function(){ 
    this.remove(); 
    this.unbind(); 
} 

請讓我知道如果你需要任何額外的信息。提前致謝!

回答

1

對於這種情況,您應該利用onDestroy函數進行超出Marionette提供的額外清理工作。視圖被替換或刪除時,木偶會自動調用onDestroy

onDestroy: function() { 
    App.vent.off('ButtonClicked', this.onButtonClicked, this); 
    } 

從木偶文檔:

通過視圖定義提供的onDestroy方法,您可以在您的看法後,解僱你的看法 運行自定義代碼已經 破壞和清理。 onDestroy方法將被傳遞的任何參數 被銷燬。這可以讓你處理任何額外的清潔代碼,而不必重寫destroy方法。

看到這裏的工作小提琴:https://jsfiddle.net/ocfn574a/

請注意,我沒有在你的路由配置更新一個錯字:'showVeiw1' - >'showView1'

+0

啊,非常好。看起來我並沒有在上下文中傳遞,所以'ButtonClicked'的所有事件監聽器都被刪除了。謝謝您的幫助! :) – Dustin

1

您應該使用的this.listenTo(App.vent, 'ButtonClicked', this.onButtonClicked)代替App.vent.on('ButtonClicked', this.onButtonClicked, this);這樣木偶照顧在視圖被銷燬時將所有聽衆脫下,並且不需要明確處理onDestory事件來脫掉聽衆。看到更新的小提琴here。 因此,基本上在你的路由器中沒有問題,但是在註冊監聽器時存在問題,因爲監聽器不存在於視圖對象中,所以它沒有被註銷。

+0

https://jsfiddle.net/2u1nvkhv/2/ –