javascript - Ko模型持久化

标签 javascript knockout.js

我有一个关于与特定 DOM 元素关联的 knockout 模型的内存分配和消耗的问题。

假设我有一个 html 元素,并为其设置了 ko 模型。然后我用 JQuery 的remove() 销毁该元素。 然后我创建另一个具有相同 div 的元素,并再次关联相同的旧模型。

问题:第一个元素的模型是否在元素删除时停用? 当我创建具有相同 ID 的新元素时,旧模型是否仍然处于事件状态,并且它是否像处理旧元素一样处理新元素的事件? 使用 cleanNode 会改变这种行为吗?

最佳答案

Edit2:方法命名有点困惑。当我谈论 ko.cleanNode 时,实际上我想到的是 ko.removeNode (它在内部调用 cleanNode)。因此,在下面我输入 cleanNode 的所有地方,请改为阅读“removeNode”。

François Wahl 在评论中回答了您的大部分问题,因此我不会再次回答。但也许最重要的问题仍未得到解答:使用 (ko.)cleanNode 是否会改变这种行为?是的,确实如此,至少部分如此。 cleanNode 提供(自定义)绑定(bind)和钩子(Hook)来取消绑定(bind)事件处理程序,并执行各种其他清理。如果你不得不担心这类事情,那么删除 dom 节点应该始终使用 ko.cleanNode 来完成,而不是使用 jQuery。

但是,使用 cleanNode 并不能保证所有内容都得到很好的清理。正如我已经说过的,在自定义绑定(bind)中,您仍然必须响应正确的事件:

ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
    // Clean me up!
});

编辑:为了清理 View 模型,我发现在 View 模型上实现某种生命周期通常是最好的(这样你还可以获得激活/处置 Hook 等)。然后,“ View 管理器”可以处理加载 View / View 模型并处理它们。如需灵感,请查看 Durandal 框架,它在这方面做得非常好。

关于javascript - Ko模型持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25239001/

相关文章:

javascript - 在 JSF 应用程序中显示消息

javascript - 根据 slider 滑翔机 js 中的事件 li 值更改 css 值

javascript - 模态表中的按钮未触发

javascript - 如何访问数据绑定(bind)到 knockout.js 中元素的事件

javascript - 我什么时候应该使用 KnockoutJS 组件和模板?

javascript - 在隐藏元素中绘制 OpenLayers 3 map

javascript Riddle : 2 objects that seem identical with respect to constructor, 原型(prototype)和 __proto__ 链接,行为不同

asp.net-mvc - EditorFor HTML Helper 具有 knockout 功能

knockout.js - 未捕获的类型错误 : Cannot read property 'nodeType' of undefined on ko. cleanNode

javascript - knockout 启用绑定(bind)不起作用