12

Knockout 的cleanNode()功能似乎是删除节点内元素上的 jQuery 事件绑定。我怎样才能防止这种情况?
我也找不到太多的文档cleanNode()

4

4 回答 4

6

直接来自淘汰赛文档

“覆盖外部数据的清理

删除元素时,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.
};

最近我因为没完没了的调试会话而发疯。

我看到了这个问题,我希望我的回答能为那些还在寻找的人提供一个更直接的解决方案。

于 2015-06-11T19:57:22.930 回答
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 不在类型中。

于 2015-07-09T13:35:29.540 回答
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

于 2013-05-10T19:35:02.840 回答
-3

处理此问题的最佳方法是将 jQuery 绑定代码与淘汰赛绑定分开。这样,您可以简单地调用该函数来重做 jQuery 绑定。不幸的是,可能需要对现有代码进行代码重构才能做到这一点。

于 2014-08-11T06:41:04.583 回答