В одностраничном приложении, созданном с помощью Durandal, у меня есть представление настроек с разными разделами. Я использую childRouter для разрешения различных разделов.
В этом приложении много кода подключается к событиям жизненного цикла композиции, которые использует Durandal. Например, эта пользовательская привязка:
ko.bindingHandlers.autoFocus = {
init: function (element) {
var $element = $(element),
setFocus = function () {
$element.focus();
};
router.on('router:navigation:composition-complete', setFocus);
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
router.off('router:navigation:composition-complete', setFocus);
$element = null;
});
}
};
Эта настраиваемая привязка до сих пор функционировала отлично, устанавливая фокус на поле, к которому применялась привязка при отображении представления.
Однако с дочерним маршрутизатором время отключено. Похоже, что главный маршрутизатор запускает событие 'router:navigation:composition-complete'
при загрузке представления «Настройки». В этот момент дочерний вид еще не отображается, и элемент с привязкой автофокуса не получает фокус. Еще нагляднее это видно при переходе между страницами настроек: при выходе со страницы фокус получает поле с привязкой автофокуса к старому дочернему представлению, затем новое дочернее представление отображается без сфокусированного элемента.
Есть ли способ заставить дочерний маршрутизатор также пропускать события? Или, возможно, заставить главный маршрутизатор отложить события до завершения работы дочернего маршрутизатора?
Я также читал, что это применимо и к другим этапам композиции: например. обратный вызов деактивации не будет вызываться в модели представления дочернего представления. Таким образом, общее исправление для запуска событий на дочерних маршрутизаторах было бы идеальным решением, которое я ищу.
Заранее спасибо.