События Durandal router/жизненного цикла при использовании childRouter

В одностраничном приложении, созданном с помощью 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' при загрузке представления «Настройки». В этот момент дочерний вид еще не отображается, и элемент с привязкой автофокуса не получает фокус. Еще нагляднее это видно при переходе между страницами настроек: при выходе со страницы фокус получает поле с привязкой автофокуса к старому дочернему представлению, затем новое дочернее представление отображается без сфокусированного элемента.

Есть ли способ заставить дочерний маршрутизатор также пропускать события? Или, возможно, заставить главный маршрутизатор отложить события до завершения работы дочернего маршрутизатора?

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

Заранее спасибо.


person Hans Roerdinkholder    schedule 29.01.2014    source источник
comment
Как ни странно, я наблюдаю ту же проблему при использовании дочернего маршрутизатора, где, если у меня есть обратный вызов canDeactivate, дочерний маршрутизатор фактически изменяется, но основной маршрутизатор отменяет навигацию, когда я возвращаю false из canDeactivate, поэтому основной и дочерний маршрутизаторы больше не синхронизированы. . :) Я не знаю, похоже ли это на то, что вы видите, но если я найду исправление, я поделюсь им.   -  person PW Kad    schedule 29.01.2014


Ответы (1)


Попробуй это:

ko.bindingHandlers.autoFocus = {
    init: function (element) {
        var $element = $(element),
            setFocus = function (child, parent, context) {
                $element.focus();
                        if (child.router)
                            child.router.on('router:navigation:composition-complete', 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;
        });
    }
};
person Adel Sal    schedule 07.02.2014