对于与特定DOM元素相关联的淘汰模型,我有一个关于内存分配和消耗的问题。
假设我有一个html元素,我为它设置了一个ko模型。然后我用JQuery的remove()破坏元素。 然后我创建另一个元素,使用相同的div,并再次关联相同的旧模型。
问题:是否删除元素时停用的第一个元素的模型? 当我创建具有相同ID的新元素时,旧模型是否仍处于活动状态,并且它是否像处理旧元素一样处理新元素的事件? 使用cleanNode会改变这种行为吗?
答案 0 :(得分:1)
Edit2:方法命名有点混乱。当我在谈论ko.cleanNode时,实际上我在考虑ko.removeNode(它在内部调用cleanNode)。因此,在我输入cleanNode的地方的任何地方,请改为读取removeNode。
弗朗索瓦·瓦尔在评论中回答了你的大部分问题,所以我不会再回答。但也许最重要的问题仍然没有答案:使用(ko。)cleanNode会改变这种行为吗?是的,至少部分是这样。 cleanNode提供(自定义)绑定和钩子来取消绑定事件处理程序,并进行各种其他清理。如果你不得不担心这种事情,删除dom节点应该总是使用ko.cleanNode,而不是使用jQuery。
但是,使用cleanNode并不能保证一切都得到很好的清理。正如我已经说过的那样,在自定义绑定中,你仍然必须回应正确的事件:
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
// Clean me up!
});
编辑:要清理一个视图模型,我发现通常最好是在视图模型上实现某种生命周期(所以你也可以使用activate / dispose钩子等)。然后,“视图管理器”可以处理加载视图/视图模型并处理它们。如需灵感,请查看Durandal框架,它可以很好地完成这项工作。