我需要销毁 Backbone Collection 吗?
Do I need to destroy a Backbone Collection?
如果我在 Backbone 中创建了一个新的 Collection 实例,我需要注意删除它吗?
这与我删除视图时视图绑定到 models/collections 的解除绑定/stopListeningTo 事件无关。
这种情况是我可能会创建多个 collection 并将它们多次传递给视图。每个视图都被彻底删除,它绑定到 collection 的任何回调都被删除,但 collection 本身没有。
我不确定一旦用 collection 实例化的视图被删除,JavaScript 的垃圾 collection 是否只会删除 collection - 因为它不再被任何东西引用?
例如在下面的。如果 changePage 被多次调用(用户在两个页面之间来回轻弹)每次我创建一个名为 pageCollection 的新 collection。这将传递给 OtherView 的新实例。每次 OtherView 都会被移除,并且它附加到 collection 的任何回调都会被移除。但不是页面Collection本身。
在这种情况下,我可以依靠 JavaScript 删除页面 Collection 因为随着视图的消失,它不再被引用了吗?或者 - 我应该跟踪它并将其删除吗?
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
}
})
唯一保留对集合的引用的是 OtherView
实例。您只需要确保不存在对视图的引用。垃圾收集器会在它认为合适的时候收集它。
DOM 中的视图元素将阻止其被垃圾收集器收集。因此,如您所知,在视图上调用 remove
或手动取消绑定所有内容(来自 jQuery、Backbone 和本机的事件以及任何引用)是必要的。
如果 model.collection
尚未设置,模型在添加到集合时会自动保留对集合的引用。因此,如果它们来自另一个系列,模型将不会获得新系列并且一切都很好,请记住这一点,因为它可能会在某天引起问题。
[...] can I rely on JavaScript to remove pageCollection
[...]
我会说 是 因为无论如何,Backbone 集合没有 delete
功能。使用 JavaScript,您 真的不需要跟踪对象 并明确删除它们。您需要跟踪引用并将其删除。
提前研究一下可能存在的内存泄露问题固然好,但也最好不要掉进过早优化的无限坑中。当您遇到无法找到源头的泄漏,或者只是不知道如何修复时,请返回 SO 并询问。
如果我在 Backbone 中创建了一个新的 Collection 实例,我需要注意删除它吗?
这与我删除视图时视图绑定到 models/collections 的解除绑定/stopListeningTo 事件无关。
这种情况是我可能会创建多个 collection 并将它们多次传递给视图。每个视图都被彻底删除,它绑定到 collection 的任何回调都被删除,但 collection 本身没有。
我不确定一旦用 collection 实例化的视图被删除,JavaScript 的垃圾 collection 是否只会删除 collection - 因为它不再被任何东西引用?
例如在下面的。如果 changePage 被多次调用(用户在两个页面之间来回轻弹)每次我创建一个名为 pageCollection 的新 collection。这将传递给 OtherView 的新实例。每次 OtherView 都会被移除,并且它附加到 collection 的任何回调都会被移除。但不是页面Collection本身。
在这种情况下,我可以依靠 JavaScript 删除页面 Collection 因为随着视图的消失,它不再被引用了吗?或者 - 我应该跟踪它并将其删除吗?
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
}
})
唯一保留对集合的引用的是 OtherView
实例。您只需要确保不存在对视图的引用。垃圾收集器会在它认为合适的时候收集它。
DOM 中的视图元素将阻止其被垃圾收集器收集。因此,如您所知,在视图上调用 remove
或手动取消绑定所有内容(来自 jQuery、Backbone 和本机的事件以及任何引用)是必要的。
如果 model.collection
尚未设置,模型在添加到集合时会自动保留对集合的引用。因此,如果它们来自另一个系列,模型将不会获得新系列并且一切都很好,请记住这一点,因为它可能会在某天引起问题。
[...] can I rely on JavaScript to remove
pageCollection
[...]
我会说 是 因为无论如何,Backbone 集合没有 delete
功能。使用 JavaScript,您 真的不需要跟踪对象 并明确删除它们。您需要跟踪引用并将其删除。
提前研究一下可能存在的内存泄露问题固然好,但也最好不要掉进过早优化的无限坑中。当您遇到无法找到源头的泄漏,或者只是不知道如何修复时,请返回 SO 并询问。