【发布时间】:2015-03-13 23:01:00
【问题描述】:
在我的 Backbone 项目中,我有一个创建视图的路由器,viewA。
viewA 创建一个子视图 viewA2 作为其渲染过程的一部分。
viewA2 有一个包含卡片模型的集合,但我还在viewA2 的initialize() 函数中声明了另一个标签模型集合。像这样:
initialize: function() {
this.tagCollection = new tagModels.TagCollection();
this.tagCollection.fetch({
reset: true
});
this.listenTo(this.collection, 'change:tags', this.updateContentList);
this.listenTo(this.collection, 'reset remove', this.updateContentList);
this.listenTo(this.tagCollection, 'reset', this.resetTags);
this.listenTo(this.tagCollection, 'add', this.addTag);
this.listenTo(this.tagCollection, 'remove', this.removeTag);
}
现在,路由器有时会在应用程序中切换页面,摆脱 viewA 并将其替换为 viewB。在切换到viewB 之前,我会这样做:
viewA2.tagCollection.reset();
viewA2.remove();
viewA.remove();
根据 Chrome 中的 Backbone 扩展,viewA 和 viewA2 都已销毁,但 viewA2.tagCollection 仍然存在,即使它已被重置且不包含模型。每次我切换视图时,都会添加另一个集合。
为什么空集合不死?它是其属性的视图不再存在。在删除 viewA2 之前,我也尝试过 viewA2.stopListening()。
我意识到绕过这个问题的一种方法是在链的更上游创建tagCollection,例如在路由器中,并将对它的引用传递给viewA,然后从那里传递给viewA2。对于我的应用程序来说,这可能是一个更好的设计。但是在视图链中上下传递引用感觉很笨拙。我还是应该采用这种方法吗?
最后。我知道在一个视图中收听两个集合可能不是最佳实践。如果这被认为是一个主要问题,我可以详细说明我为什么这样做。
【问题讨论】:
-
请原谅这个笨拙的参考,但你试过把它射在头上吗?
-
@Elliot Bonneville 它可能会这样......:/
-
delete viewA2.tagCollection摆脱它了吗? -
@ivarni - 不,那不行。
-
删除了google-chrome-extension 标签。除非是关于扩展开发,否则不要使用它。
标签: javascript backbone.js collections zombie-process