【问题标题】:Destroy observables on unsubscribe在取消订阅时销毁 observables
【发布时间】:2013-04-16 07:43:17
【问题描述】:

我有以下情况: - 具有大量项目的应用程序。 (100万+) - 在列表中的每个项目上都有一个可观察的。

如果我从应用程序初始化创建可观察对象,应用程序将冻结,因为它需要大量处理和内存。解决方案是按需创建它们,因为项目将一次部分呈现。这很容易做到。

我需要的是,在我取消绑定项目后,显示一个新批次,销毁已创建但不再使用的可观察对象。

一种解决方案是,当我切换到新批次时,遍历旧批次并销毁。这也很容易做到,但不幸的是还不够。

我的应用程序被拆分为多个组件,每个组件可能使用也可能不使用主项目池中的项目。这意味着我不能只搜索之前解绑的项目并销毁可观察对象,而是必须搜索所有组件。从性能的角度来看,这并不好,而且组件不需要相互了解也不好。

所以我的问题是。一旦没有更多订阅者,在淘汰赛中是否有任何方法(内置或不内置)来销毁可观察对象?

谢谢。

【问题讨论】:

  • ko.computed 必须手动处理,因为它会创建对其他可观察对象的新引用,但是一旦没有更多对它的引用,JS 就应该对普通的可观察对象进行垃圾回收。我错了吗?
  • 并非如此。 ko.computed 有以下 2 个选项: disposeWhen 和 disposeWhenNodeIsRemoved 以便处理它们。 Observables 基本上是附加到模型上的,所以除非你专门删除它们,否则它们不会被收集。不过,我的问题是,我需要知道什么时候处理 observables,像 disposeWhenNodeIsRemoved 这样的东西绝对很棒,但我没有找到类似的东西或回调。
  • 您的“按需创建逻辑”是在单个位置还是在每个组件中?如果您可以将该逻辑放在一个位置,您是否也可以跟踪它们并取消绑定任何以前的逻辑?
  • 是的,但这就是我想说的,我不想跟踪它。就算创建起来很容易,毁掉它也可能会带来各种各样的问题。我想依靠“淘汰赛”解决方案。
  • 如果您添加一个简短的代码示例来说明您正在尝试做什么,这会有所帮助。

标签: knockout.js knockout-2.0


【解决方案1】:

Delete operator 在这种情况下不工作吗?如果删除对象的某些属性是您想要完成的,那么使用 delete 运算符应该可以解决问题。

var viewModel = { name: ko.observable("me"),` age: "a lot" };

当您准备好删除属性时(通过事件或其他方式)

$('element').on('event', function() { delete viewModel.prop; });

这是假设您只想定位淘汰视图模型对象中的一个属性。

【讨论】:

  • delete 用作“删除方法”。问题是跟踪我必须删除的内容。最初的问题是,如果淘汰赛让我能够跟踪而不是自己编写代码。
  • @DumitrescuBogdan 我认为这就是你要找的。 link
猜你喜欢
  • 1970-01-01
  • 2021-02-25
  • 2016-12-06
  • 2017-08-24
  • 2017-03-26
  • 2020-10-28
  • 2019-05-15
  • 2014-04-02
  • 2018-02-13
相关资源
最近更新 更多