Подтвердить что ты не робот

Нокаут cleanNode() удаляет привязки событий jquery?

Функция нокаута cleanNode(), похоже, удаляет привязки событий jQuery к элементам внутри node. Как я могу предотвратить это? Существует не так много документации, которую я мог бы найти на cleanNode().

4b9b3361

Ответ 1

Лучший способ справиться с этим - сохранить код привязки jQuery отдельно от привязок нокаута. Таким образом, вы можете просто вызвать функцию для повторной привязки jQuery. К сожалению, для этого может потребоваться рефактор кода существующего кода.

Ответ 2

Непосредственно из нокаутных документов:

"Переопределение очистки внешних данных

При удалении элемента Knockout запускает логику для очистки любых данных, связанных с элементом. Как часть этой логики, Knockout вызывает метод jQuerys cleanData, если jQuery загружен на вашу страницу. В расширенных сценариях вы можете запретить или настроить способ удаления этих данных в приложении. Нокаут предоставляет функцию 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.
};

В последнее время я сошел с ума из-за бесконечных сеансов отладки.

Я видел этот вопрос, и я надеюсь, что мой ответ даст более немедленное решение для тех, кто все еще ищет.

Ответ 3

@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 не имеет типов.

Ответ 4

cleanNode не принимает никаких параметров, которые позволяли бы предотвратить это поведение. Я думаю, что ваш лучший вариант - создать собственный метод, основанный на функции нокаута, но без очистки jQuery. Не создав примерное приложение для проверки, я бы посмотрел на создание функции, которая идентична функции cleanSingleNode (node) и удалит эту строку:

if ((typeof jQuery == "function") && (typeof jQuery['cleanData'] == "function"))
        jQuery['cleanData']([node]);

Здесь вы можете проверить источник отладки, чтобы получить дополнительную информацию о других связанных внутренних функциях: http://knockoutjs.com/downloads/knockout-2.2.1.debug.js