木偶不会清除破坏模型和集合()

时间:2016-01-21 03:04:59

标签: backbone.js memory-leaks marionette

我正在考虑从vanilla Backbone转移到Marionette,就像Backbone一样,我首先关心的是确保我没有内存泄漏,因为我建立了一个页面申请。

使用Backbone调试器,我可以看到当我更改LayoutView区域中显示的视图时,HTML确实被破坏了,但模型和/或集合永远保留在内存中。

首先,这是我的PostController代码:

var PostController = Marionette.Object.extend({     
    showOne: function(post_cd){
        // layoutView
        var postView = new PostView();

        // Create data containers
        var comments = new Comments(); // This is a Backbone.Collection
        var post = new Post(); // This is a Backbone.Model

        // Create subviews (compositeView)
        var commentsView = new CommentsView({collection: comments, model: post});

        // Render the compositeView in the layoutView when displaying the layoutView
        postView.on('before:show', function(region, view, options){
            this.showChildView('comments', commentsView);
        });

        // Data init.
        post.fetch();
        comments.fetch();

        // Show the view on the main region.
        // app.layout is another LayoutView binded to <body>
        app.layout.showChildView('main', postView); 
    }
});

接下来,我的UserController代码:

var UserController = Marionette.Object.extend({
    showOne: function(userCd){
        var user = new User({user_cd: userCd});

        // Marionette.ItemView
        var userItemView = new UserItemView({model: user});

        // Fetch the user
        user.fetch();

        // Show the view on the main region
        app.layout.showChildView('main', userItemView); 
    }
});

非常简单,我只是创建一个模型/集合和一个相关的视图,然后在我的&#34; main&#34;中切换它们。区域。

以下是我非常简单的观点:

首先,UserItemView(在UserController中使用):

var UserItemView = Marionette.ItemView.extend({
    tagName: 'div',
    template: "<a href='#post/48' id='goToPost'>Go to post 48.</a>",

    events:{
        "click #goToPost": "goToPost",
    },

    goToPost: function(e){
        e.preventDefault();
        app.testRouter.triggerMethod('post:show', 48);
    }
});

我的复合视图&#34;评论视图&#34; (用于PostController):

var CommentsView = Marionette.CompositeView.extend({
    childView: CommentItemView,
    childViewContainer: "#comments_list",

    tagName: 'div',
    id: 'comments',
    template: '<ul id="comments_list"></ul><a href="#" id="goToUser">Go to user 20.</a>',

    ui: {
        userLink: '#goToUser'
    },

    events:{
        "click @ui.userLink": "goToUser"
    },

    goToUser: function(e){
        e.preventDefault();
        app.testRouter.triggerMethod('user:show', 20);
    }
});

这些是Backbone Debugger的结果:

1)在帖子页面上打开应用程序:

查看: Views1

型号: enter image description here

正如所料,3款车型。一篇文章(模型)和两篇评论(收集)。

类别: enter image description here

2)导航到我的用户&#34;页:

查看: enter image description here

正确删除旧视图并添加新视图。

型号: enter image description here

我的3个老款仍然存在!和我的新人一起。

类别: enter image description here

即使此页面没有使用任何集合,Post页面中的旧页面仍在此处。

我错过了什么吗?我应该手动清除onDestroy()中的那些吗?如果是这样,怎么样?我尝试删除并设置为null,但没有一个工作。

我还在页面之间点击一段时间后使用堆快照检查了内存差异,它确实无限上升。

感谢。

1 个答案:

答案 0 :(得分:0)

事实证明,我被Backbone调试器控制,它似乎保持实例存活,因此您可以继续监视/检查它们。 木偶探险家也有同样的缺陷。

我禁用了它们,并在我的Heap配置文件中寻找我的骨干对象,并发现它的行为应该如此。

对于那些有相同问题的人来说,要在堆配置文件中找到骨干对象,不要搜索&#34; backbone&#34;,&#34; model&#34;或者其他什么,搜索&#34;孩子&#34;。 由于控制器的工作原理,所有骨干对象都在&#34; child&#34;下。