【问题标题】:Can't kill a zombie Collection in Backbone project无法在 Backbone 项目中杀死僵尸集合
【发布时间】:2015-03-13 23:01:00
【问题描述】:

在我的 Backbone 项目中,我有一个创建视图的路由器,viewA

viewA 创建一个子视图 viewA2 作为其渲染过程的一部分。

viewA2 有一个包含卡片模型的集合,但我还在viewA2initialize() 函数中声明了另一个标签模型集合。像这样:

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 扩展,viewAviewA2 都已销毁,但 viewA2.tagCollection 仍然存在,即使它已被重置且不包含模型。每次我切换视图时,都会添加另一个集合。

为什么空集合不死?它是其属性的视图不再存在。在删除 viewA2 之前,我也尝试过 viewA2.stopListening()

我意识到绕过这个问题的一种方法是在链的更上游创建tagCollection,例如在路由器中,并将对它的引用传递给viewA,然后从那里传递给viewA2。对于我的应用程序来说,这可能是一个更好的设计。但是在视图链中上下传递引用感觉很笨拙。我还是应该采用这种方法吗?

最后。我知道在一个视图中收听两个集合可能不是最佳实践。如果这被认为是一个主要问题,我可以详细说明我为什么这样做。

【问题讨论】:

  • 请原谅这个笨拙的参考,但你试过把它射在头上吗?
  • @Elliot Bonneville 它可能会这样......:/
  • delete viewA2.tagCollection 摆脱它了吗?
  • @ivarni - 不,那不行。
  • 删除了google-chrome-extension 标签。除非是关于扩展开发,否则不要使用它。

标签: javascript backbone.js collections zombie-process


【解决方案1】:

我似乎被 Backbone Chrome 扩展的输出分心了。当 Views 被删除时,它会对 Views 进行评分,但对于 Collections 的评分却不同 - 至少在这种情况下 - 当它们被销毁时。

我的僵尸收藏多次触发相同的事件,因为它们在后台徘徊。事实证明,这实际上是通过在删除 viewA 之前删除 viewA2 来解决的。

Backbone Chrome 的输出让我相信 Collections 仍在内存中,但自从在 View 之前删除子视图后,事件不再被多次触发。

我还通过在对旧集合使用 javascript delete 后尝试将集合详细信息写入控制台来确认不存在旧集合。 (感谢@ivarni。)已删除的集合未定义,但在 Backbone Chrome 扩展程序中仍有一个明显有效的条目。

【讨论】:

  • 是的,我刚想说我不相信你说delete没有删除它:)
猜你喜欢
  • 1970-01-01
  • 2013-06-01
  • 2011-09-26
  • 2013-06-25
  • 2011-09-14
  • 2014-06-19
  • 1970-01-01
  • 2011-04-29
  • 2015-04-12
相关资源
最近更新 更多