【问题标题】:proper way to destroy knockout ViewModel销毁淘汰赛ViewModel的正确方法
【发布时间】:2014-11-01 18:23:37
【问题描述】:

我有一个全文搜索应用程序。对于用户发起的每次新搜索,从服务器返回的上下文段落和相关描述性数据都使用映射插件映射到视图模型。

但在实例化新的视图模型之前,需要销毁从先前搜索中实例化的视图模型,并且从它创建的所有 DOM 元素都从 DOM 中删除。

使用映射插件创建的陈旧 ViewModel 销毁(或从中删除项目)的正确方法是什么?

编辑: 我不明白,从documentation,如何使用这些方法:

          mappedRemoveAll
          mappedDestroy
          mappedDestroyAll

或者如何将多个对fromJS 方法的调用与key mapping 结合起来,以便我可以使用mappedRemove 方法。我收到我的对象不支持 mappedRemove 的错误。

【问题讨论】:

  • 更多细节或一些代码会有所帮助...
  • @Benjamin Gruenbaum:有没有办法像 MyViewModel.empty() 一样一举“吹走”由映射插件 fromJS 创建的整个视图模型?
  • 为什么要清空它?您可以删除它绑定的元素(即,如上面链接中所述,反转 applyBindings),然后让 GC 处理它
  • 它是一个复杂的嵌套对象,使用嵌套的 foreach 绑定绑定到 许多 个 DOM 元素。使用 View Model 不是直接处理 UI,而是处理模型,这不是重点吗?我正在寻找一种方法来告诉 Knockout,“这个模型已经失效。请删除 Knockout 从中创建的所有 DOM 元素。”

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

我假设您有一个高级 searchResult 对象,其中包含对您提到的所有其他复杂对象的引用。在这种情况下,假设您的顶级视图模型如下所示:

var vm = {
    something: ko.observable(),
    somethingElse: ko.observable(),
    searchResult: ko.observable()
};

并且您处理所有映射并将生成的大对象分配给searchResult。那么,您需要做的就是为 searchResult 分配一个不同的值。 Knockout 将尽可能高效地处理所有 DOM 元素处理。并且您的旧对象将不再被任何东西引用,因此垃圾收集器会清理它。如果您页面的其他部分保留了 vm.searchResult 中的引用,那么您可以实现一个 dispose 函数并清理它们。

【讨论】:

  • 我的 searchResults 对象被提供给插件的 mapping.fromJS 方法。我的 searchResults 对象,在它被映射之前是一组标题对象;每个标题对象包含搜索词出现的上下文段落;段落中的每个单词本身就是具有属性的对象。我已经编辑了我的问题,以解释我遇到问题的插件方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2017-09-22
  • 2012-12-24
相关资源
最近更新 更多