Функция нокаута cleanNode()
, похоже, удаляет привязки событий jQuery к элементам внутри node. Как я могу предотвратить это?
Существует не так много документации, которую я мог бы найти на cleanNode()
.
Нокаут cleanNode() удаляет привязки событий jquery?
Ответ 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