Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout cleanNode()删除jquery事件绑定?_Jquery_Knockout.js - Fatal编程技术网

Knockout cleanNode()删除jquery事件绑定?

Knockout cleanNode()删除jquery事件绑定?,jquery,knockout.js,Jquery,Knockout.js,Knockout的cleanNode()函数似乎正在删除节点内元素上的jQuery事件绑定。我怎样才能防止这种情况发生? 我在cleanNode()上也找不到太多文档。cleanNode不采用任何参数来阻止这种行为。我认为最好的选择是基于Knockout函数创建自己的方法,但不需要jQuery清理。在没有构建示例应用程序进行验证的情况下,我会创建一个与cleanSingleNode(node)相同的函数,并删除这一行: if ((typeof jQuery == "function") &

Knockout的
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;
    }