子视图上的view.remove()在骨干中实例化之前被调用,从而产生僵尸视图

时间:2015-01-27 06:14:37

标签: javascript backbone.js memory-leaks views zombie-process

我有8个主视图,在每个主视图中我创建了2,3个子视图;每个主视图都有一个方法" deleteChildViews"用于删除在删除主视图之前调用的子视图。

现在,如果用户经常从一个主视图切换到另一个主视图,那么对于每个主视图,它的" deleteChildViews"方法被称为。

问题

由于每个子子视图都需要AMD,因此初始化并返回其对象需要一些时间。对于此平均时间,分配视图的变量将是未定义的。

每次我们从一个主视图切换到另一个主视图时,都会调用已加载视图的deleteChildViews进行子视图清理,然后启动新视图。由于从一个主视图频繁转换到另一个主视图,当从父(主视图)调用deleteChildViews方法时,发现其子视图未定义,因此函数终止而没有子清理。经过一段时间后,这些儿童观点才会出现,导致僵尸观点不再留下任何参考,以消除这些观点。

我应该使用哪种方法来删除这些僵尸视图?有时它们也会导致唤醒死亡的主要观点。

路由器中的代码,在给定路由初始化特定视图之前调用的函数。

routes: {
    main: mainHandler
},
initialize: function () {
    $(window).off().on("hashchange", that.remove_previous_view);
},
mainHandler: function () {
    // initializing mianView
    that.view = new mainView();
},
remove_previous_view = function () {
    if (that.view) {
        // method called to delete sub-views
        that.view.deleteChildViews();
        //removing child view itself
        that.view.remove();
    }
}

mainView中的代码

initialize: function () {
    this.render();
},
render: function () {
    this.el.html(_.template('mainTemplate'));
    this.initiateChildView();
},
initiateChildView: function () {
    this.childView = new ChildView();
},
deleteChildViews: function () {
    if (this.childView) {
        //used to remove childViews inside the child views.
        this.childView.deleteChildViews();
        this.childView.remove();
    }
}

0 个答案:

没有答案