如果我在Backbone中创建一个新的Collection实例,我是否需要关心删除它?
这不是关于删除视图时视图绑定到模型/集合的unbinding / stopListeningTo事件。
这种情况是我可能会创建多个集合并多次将它们传递给视图。每个视图都被彻底删除,并且删除了绑定到集合的任何回调,但集合本身不会被删除。
我不确定,一旦用集合实例化的视图被删除,JavaScript的垃圾收集是否只会删除集合 - 因为它不再被任何东西引用?
E.g。在下面的。如果每次创建名为pageCollection的新集合时多次调用changePage(用户在两个页面之间来回切换)。这将传递给OtherView的新实例。每次删除OtherView并删除附加到集合的任何回调。但不是pageCollection本身。
在这种情况下,我可以依赖JavaScript来删除pageCollection,因为视图消失了,它不再被引用了吗?或者 - 我应该跟踪并删除它吗?
app = {};
MyCollection = Backbone.Collection.extend({
pagination: function() {
return this.slice(0,19); //e.g. first 20 items
}
}}
app.myCollection = new MyCollection();
app.myCollection.fetch();
MyView = Backbone.View.extend({
changePage: function(page) {
var pagedModels = app.myCollection.pagination();
//I'll get one of these every time changePage is called
var pagedCollection = new MyCollection(pagedModels);
//use pageCollection to render the view e.g.
var thumbsView = new OtherView({collection: pagedCollection});
//not shown - use a 'region controller' to render this view
//this will dispose of the last instance of OtherView and
//callbacks it attached to the collection
}
})
答案 0 :(得分:0)
唯一保留对集合的引用的是OtherView
实例。您只需确保不存在对视图的引用。垃圾收集器会在认为合适时收集它。
DOM中的视图元素将阻止垃圾收集器收集它。因此,正如您所知,在视图上调用remove
或手动解除所有内容(来自jQuery,Backbone和native的事件以及任何引用)是必要的。
如果未添加model.collection
,则模型在添加到集合时会自动保留对集合的引用。因此,如果他们来自另一个系列,模型将无法获得新的系列,一切都很好,只要记住这一点,因为它可能会在某一天引起问题。
[...]我可以依赖JavaScript删除
pageCollection
[...]
我会说是因为无论如何,Backbone集合没有delete
函数。使用JavaScript,您实际上不需要跟踪对象并明确删除它们。您需要跟踪参考资料并将其删除。
提前研究可能的内存泄漏问题是件好事,但最好不要陷入过早优化的无限漏洞。如果您在找不到来源的地方发现泄漏,或者只是不明白如何修复,请回到SO并询问相关内容。