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

时间:2013-05-10 09:56:40

标签: jquery knockout.js

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

4 个答案:

答案 0 :(得分:6)

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

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

我看到了这个问题,我希望我的回答可以为那些仍在搜索的人提供更直接的解决方案。

答案 1 :(得分: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不在打字中。

答案 2 :(得分: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

答案 3 :(得分:-3)

处理此问题的最佳方法是将jQuery绑定代码与knockout绑定分开。通过这种方式,您可以简单地调用该函数来重做jQuery绑定。 不幸的是,可能需要使用现有代码的代码重构来实现此目的。