Knockout 的cleanNode()
功能似乎是删除节点内元素上的 jQuery 事件绑定。我怎样才能防止这种情况?
我也找不到太多的文档cleanNode()
。
4 回答
直接来自淘汰赛文档:
“覆盖外部数据的清理
删除元素时,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.
};
最近我因为没完没了的调试会话而发疯。
我看到了这个问题,我希望我的回答能为那些还在寻找的人提供一个更直接的解决方案。
@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 不在类型中。
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
处理此问题的最佳方法是将 jQuery 绑定代码与淘汰赛绑定分开。这样,您可以简单地调用该函数来重做 jQuery 绑定。不幸的是,可能需要对现有代码进行代码重构才能做到这一点。