2016-05-13 75 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/ –