【问题标题】:Deleting a collection when closing a CollectionView in Backbone.Marionette在 Backbone.Marionette 中关闭 CollectionView 时删除集合
【发布时间】:2014-02-27 03:09:10
【问题描述】:

在我的项目中关闭 CollectionView 后,它引用的集合仍然可用。再次打开 CollectionView 会复制集合,因为它会再次重新加载数据。我认为这是 documentation 中的预期行为,它表示 CollectionView 在关闭时所做的所有事情是:

  1. 解除所有listenTo事件的绑定
  2. 取消绑定所有自定义视图事件
  3. 取消绑定所有 DOM 事件
  4. 取消绑定所有渲染的项目视图
  5. 从 DOM 中移除 this.el
  6. 在视图上调用 onClose 事件(如果提供)

我猜我应该在 onClose 事件处理程序上管理集合。有没有删除与视图关联的集合和模型的好方法?

【问题讨论】:

    标签: marionette


    【解决方案1】:

    在您的情况下,没有必要删除该集合。未被另一个对象直接引用的变量(在这种情况下是您的集合)将被 javascript 垃圾收集。因此,当视图和模块关闭并且没有其他内容引用该集合时,它将被删除。

    如果您想确保不会收到任何僵尸事件,您可以在关闭模块和/或视图时清除它的事件侦听器:

    myCollection.off();
    

    当然,您的集合是一个全局变量(技术上是窗口对象的属性),那么是的,像这样删除它可能是个好主意:

    delete window.myCollection;
    

    除此之外,您无需担心将其从内存中删除,因为其他引用的对象已关闭...

    【讨论】:

    • 感谢您的回答。我想我没有很好地解释自己。该视图与我按需加载和卸载的子模块相关联,但我不能假设将再次需要数据。因此,当我卸载模块并删除视图时,我还想删除与之关联的集合和模型。要删除模块并查看我只是用另一个模块替换它正在使用的区域,视图正确关闭但集合保留在内存中。
    • 好的,我想我现在明白你的意思了——我会更新我的答案,但在我这样做之前我肯定明白:除了模块和引用你想要的集合的视图之外还有什么删除?
    • 谢谢!我认为模块和视图都被删除了,所以唯一要从内存中删除的是集合及其模型。
    • 答案已更新。简短的回答是不用担心它们会自行消失 :)
    • 谢谢!我正在尝试,我认为它确实有效。我在 onClose 方法上只使用了一个简单的删除,但是集合和模型仍然出现在 DevTools 的堆快照上,所以我猜它们并没有消失。我会调查一下,因为这可能是我做错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多