Knockout的cleanNode()
函数似乎正在删除节点内元素的jQuery事件绑定。我怎样才能防止这种情况发生?
我在cleanNode()
上找不到太多文档。
答案 0 :(得分:6)
直接来自knockout docs:
“覆盖外部数据的清理
删除元素时,Knockout会运行逻辑来清除与该元素关联的所有数据。作为这个逻辑的一部分,如果在页面中加载了jQuery,Knockout会调用jQuery的cleanData方法。在高级方案中,您可能希望阻止或自定义在应用程序中删除此数据的方式。 Knockout公开了一个函数ko.utils.domNodeDisposal.cleanExternalData(node),可以重写该函数以支持自定义逻辑。例如,为了防止调用cleanData,可以使用空函数替换标准的cleanExternalData实现:“
ko.utils.domNodeDisposal.cleanExternalData = function () {
// Do nothing. Now any jQuery data associated with elements will
// not be cleaned up when the elements are removed from the DOM.
};
最近我因为无休止的调试会话而疯狂。
我看到了这个问题,我希望我的回答可以为那些仍在搜索的人提供更直接的解决方案。
答案 1 :(得分:5)
@T-moty 回答工作正常,所以我编写了一个覆盖cleanExternalData方法的短函数,调用clearNode并重新设置原始方法。
private koClearNode(element: HTMLElement)
{
var original = ko.utils.domNodeDisposal['cleanExternalData'];
ko.utils.domNodeDisposal['cleanExternalData'] = function () { };
ko.cleanNode(element);
ko.utils.domNodeDisposal['cleanExternalData'] = original;
}
也适用于TypeScript,其中cleanExternalData不在打字中。
答案 2 :(得分:0)
cleanNode不会采用任何可以阻止此行为的参数。我认为你最好的选择是基于Knockout函数创建自己的方法,但没有jQuery清理。如果没有构建要验证的示例应用程序,我会创建一个与cleanSingleNode(node)相同的函数并删除此行:
if ((typeof jQuery == "function") && (typeof jQuery['cleanData'] == "function"))
jQuery['cleanData']([node]);
您可以在此处查看调试源,以获取有关其他相关内部功能的更多信息:http://knockoutjs.com/downloads/knockout-2.2.1.debug.js
答案 3 :(得分:-3)
处理此问题的最佳方法是将jQuery绑定代码与knockout绑定分开。通过这种方式,您可以简单地调用该函数来重做jQuery绑定。 不幸的是,可能需要使用现有代码的代码重构来实现此目的。