【发布时间】:2013-05-04 23:35:57
【问题描述】:
Knockout 的cleanNode() 函数似乎正在删除节点内元素上的jQuery 事件绑定。我怎样才能防止这种情况发生?
我在cleanNode() 上也找不到太多文档。
【问题讨论】:
标签: jquery knockout.js
Knockout 的cleanNode() 函数似乎正在删除节点内元素上的jQuery 事件绑定。我怎样才能防止这种情况发生?
我在cleanNode() 上也找不到太多文档。
【问题讨论】:
标签: jquery knockout.js
直接来自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.
};
最近我因为没完没了的调试会话而发疯。
我看到了这个问题,希望我的回答能给还在寻找的人提供更直接的解决方案。
【讨论】:
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 不在类型中。
@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 绑定。 不幸的是,可能需要对现有代码进行代码重构。
【讨论】: