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

Ath*_*hri 12 jquery knockout.js

Knockout的cleanNode()功能似乎是删除了节点内元素的jQuery事件绑定.我怎么能阻止这个?
我也找不到很多文件cleanNode().

T-m*_*oty 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.
};
Run Code Online (Sandbox Code Playgroud)

最近我因为无休止的调试会话而疯狂.

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


pre*_*pic 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;
    }
Run Code Online (Sandbox Code Playgroud)

也适用于TypeScript,其中cleanExternalData不在打字中.


Ath*_*hri -3

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