【问题标题】:Knockout cleanNode() removes jquery event bindings?淘汰赛 cleanNode() 删除 jquery 事件绑定?
【发布时间】:2013-05-04 23:35:57
【问题描述】:

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

【问题讨论】:

    标签: jquery knockout.js


    【解决方案1】:

    直接来自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.
    };
    

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

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

    【讨论】:

    • 这个方法工作正常,所以我写了一个简短的函数来覆盖 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 不在类型中。
    • @prespic 很好的解决方案,但我建议你自己写答案,让未来的用户更容易看到
    【解决方案2】:

    @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 不在打字中。

    【讨论】:

    • 这是一个很好的解决方案并且正在运行。这个或它所基于的应该被标记为答案。
    【解决方案3】:

    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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这不是一个非常有用的答案。它基本上只是在说“从一开始就做不同的事情”
      猜你喜欢
      • 1970-01-01
      • 2013-09-10
      • 2022-10-17
      • 2016-03-15
      • 2013-02-04
      • 2013-08-17
      • 2013-12-27
      • 1970-01-01
      • 2018-08-04
      相关资源
      最近更新 更多