我正在考虑从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)在帖子页面上打开应用程序:
正如所料,3款车型。一篇文章(模型)和两篇评论(收集)。
2)导航到我的用户&#34;页:
正确删除旧视图并添加新视图。
我的3个老款仍然存在!和我的新人一起。
即使此页面没有使用任何集合,Post页面中的旧页面仍在此处。
我错过了什么吗?我应该手动清除onDestroy()中的那些吗?如果是这样,怎么样?我尝试删除并设置为null,但没有一个工作。
我还在页面之间点击一段时间后使用堆快照检查了内存差异,它确实无限上升。
感谢。
答案 0 :(得分:0)
事实证明,我被Backbone调试器控制,它似乎保持实例存活,因此您可以继续监视/检查它们。 木偶探险家也有同样的缺陷。
我禁用了它们,并在我的Heap配置文件中寻找我的骨干对象,并发现它的行为应该如此。
对于那些有相同问题的人来说,要在堆配置文件中找到骨干对象,不要搜索&#34; backbone&#34;,&#34; model&#34;或者其他什么,搜索&#34;孩子&#34;。 由于控制器的工作原理,所有骨干对象都在&#34; child&#34;下。