我是否需要销毁Backbone Collection?

时间:2017-01-20 20:19:41

标签: javascript backbone.js

如果我在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
    }

})

1 个答案:

答案 0 :(得分:0)

唯一保留对集合的引用的是OtherView实例。您只需确保不存在对视图的引用。垃圾收集器会在认为合适时收集它。

DOM中的视图元素将阻止垃圾收集器收集它。因此,正如您所知,在视图上调用remove或手动解除所有内容(来自jQuery,Backbone和native的事件以及任何引用)是必要的。

如果未添加model.collection,则模型在添加到集合时会自动保留对集合的引用。因此,如果他们来自另一个系列,模型将无法获得新的系列,一切都很好,只要记住这一点,因为它可能会在某一天引起问题。

  

[...]我可以依赖JavaScript删除pageCollection [...]

我会说因为无论如何,Backbone集合没有delete函数。使用JavaScript,您实际上不需要跟踪对象并明确删除它们。您需要跟踪参考资料并将其删除。

提前研究可能的内存泄漏问题是件好事,但最好不要陷入过早优化的无限漏洞。如果您在找不到来源的地方发现泄漏,或者只是不明白如何修复,请回到SO并询问相关内容。