2014-01-17 3 views
1

Как можно правильно распоряжаться виджетами в версии 2.0? Из того, что я прочитал, это, как предполагается, автоматически выполняется при удалении из DOM, но удаление моего виджета из DOM с помощью say jQuery.remove() не вызывает вызванное canDeactivate() или деактивировать(). Есть ли какой-то конкретный способ его удаления из DOM для вызывающих вызовов деактивации?Durandal 2.0 Widget Disposal

ответ

1

Да, на самом деле есть, и это легко пропустить, потому что оно не задокументировано очень хорошо.

Knockout имеет служебную функцию ko.utils.domNodeDisposal.addDisposeCallback(element, callback). Эта функция гарантирует, что обратный вызов будет вызван, когда элемент будет удален. Однако «утилизация» в этом случае очень специфична. jQuery.remove() не запускает его. Способ удаления узла состоит в использовании ko.removeNode(element), который не только удаляет элемент DOM (и его дочерние элементы), но также выполняет некоторую дополнительную очистку в терминах обработчиков связанных событий и т. Д. (Извините, детали немного туманны. Вы можете всегда проверять реализацию Knockout, если хотите получить более подробную информацию об этом.)

Внутренне, при удалении зрения, Дюрандал использует ko.removeNode. Поэтому, когда представление удалено, все элементы также удаляются, и любые вызовы disposeCallbacks, созданные с использованием вышеупомянутой функции полезности, будут вызываться. Я уверен, что Durandal перехватывает этот процесс, чтобы вызвать обратный вызов для деактивации.

TL; DR: попробуйте ko.removeNode(element) вместо jQuery.remove(element). Это вызовет ваш деактивирующий обратный вызов.

+0

Я нашел документацию нокаута для всех, кроме своей привязки, чтобы быть светом на деталях. Даже поиск ko.removeNode не дает мне результата поиска в официальных документах. Во всяком случае, спасибо за ответ. Роб Эйзенберг также ответил на мой пост в Durandals Google Group. Использование ko.removeNode (element) действительно дает мне желаемое поведение. –

Смежные вопросы