Knockout cleanNode()删除jquery事件绑定?
Knockout的Knockout cleanNode()删除jquery事件绑定?,jquery,knockout.js,Jquery,Knockout.js,Knockout的cleanNode()函数似乎正在删除节点内元素上的jQuery事件绑定。我怎样才能防止这种情况发生? 我在cleanNode()上也找不到太多文档。cleanNode不采用任何参数来阻止这种行为。我认为最好的选择是基于Knockout函数创建自己的方法,但不需要jQuery清理。在没有构建示例应用程序进行验证的情况下,我会创建一个与cleanSingleNode(node)相同的函数,并删除这一行: if ((typeof jQuery == "function") &
cleanNode()
函数似乎正在删除节点内元素上的jQuery事件绑定。我怎样才能防止这种情况发生?我在
cleanNode()
上也找不到太多文档。cleanNode不采用任何参数来阻止这种行为。我认为最好的选择是基于Knockout函数创建自己的方法,但不需要jQuery清理。在没有构建示例应用程序进行验证的情况下,我会创建一个与cleanSingleNode(node)相同的函数,并删除这一行:
if ((typeof jQuery == "function") && (typeof jQuery['cleanData'] == "function"))
jQuery['cleanData']([node]);
您可以在此处查看调试源代码,以获得有关其他相关内部函数的更多信息:处理此问题的最佳方法是将jQuery绑定代码与敲除绑定分开。通过这种方式,您可以简单地调用函数来重做jQuery绑定。 不幸的是,要做到这一点,可能需要对现有代码进行代码重构。直接从: “覆盖外部数据的清理 删除元素时,Knockout会运行逻辑来清理与元素关联的任何数据。作为此逻辑的一部分,如果页面中加载了jQuery,Knockout会调用jQuery的cleanData方法。在高级方案中,您可能希望阻止或自定义在应用程序中删除此数据的方式。Knockout会公开一个函数ko.utils.domNodeDiscovery.cleanExternalData(节点),可以重写该节点以支持自定义逻辑。例如,为了防止调用cleanData,可以使用空函数替换标准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不在打字中。此方法工作正常,因此我编写了一个短函数,覆盖cleanExternalData方法,调用clearNode并将原始方法设置回原处<代码>私有koClearNode(元素:HtmleElement){var original=ko.utils.domNodeDisposal['cleanExternalData'];ko.utils.domNodeDisposal['cleanExternalData']=function(){};ko.cleanNode(元素);ko.utils.domNodeDisposal['cleanExternalData']=original;}也适用于TypeScript,其中cleanExternalData不适用于打字。@这是一个很好的解决方案,但我建议您编写自己的答案,以便将来的用户更容易看到。这不是一个非常有用的答案。它基本上只是说“从一开始就用不同的方式做”,这是一个很好的解决方案,并且正在发挥作用。应将此项或其基于的项标记为答案。
private koClearNode(element: HTMLElement)
{
var original = ko.utils.domNodeDisposal['cleanExternalData'];
ko.utils.domNodeDisposal['cleanExternalData'] = function () { };
ko.cleanNode(element);
ko.utils.domNodeDisposal['cleanExternalData'] = original;
}