Дюрандаль: Показ "ЗАГРУЗКИ" во время композиции

Я могу легко показать сообщение о загрузке, пока метод активации выполняет следующие действия:

        <div data-bind="compose:ActiveVm">
            <div class="text-center" style="margin : 75px">
                <i class="fa fa-spinner fa-spin"></i>
            </div>
        </div>

Однако, если я затем обновлю свое свойство ActiveVm с другой моделью просмотра, содержимое заставки не будет отображаться. Я понимаю, что содержимое заставки предназначено только для отображения при «начальной» загрузке, но какие у меня есть варианты для отображения такого сообщения при переходе от одной модели просмотра к другой?

Обратите внимание, что эта композиция не участвует в маршрутизации ...

Обновление: связанная проблема с Durandal здесь, которая может быть полезна для будущих посетителей: https://github.com/BlueSpire/Durandal/issues/414


person Shaun Rowan    schedule 19.12.2013    source источник


Ответы (2)


Здесь напрашивается комментарий «что вы пробовали?» но, учитывая, что я мог видеть преимущества этого для будущих пользователей, я хотел вложить свои 0,02 доллара -

Заставка отображается на вашем экране до тех пор, пока Дюрандаль не загрузит приложение и не заменит div содержимым id="applicationHost" с представлением оболочки и последующими загруженными представлениями. Если вы хотите сделать этот компонент многократно используемым, то вы могли бы взять это Html.Partial представление, которое загружается, и создать свое собственное представление внутри вашей app папки в вашем проекте Durandal.

Например, вы должны создать новое HTML-представление внутри папки вашего приложения -

splashpage.html

<div class="splash">
    <div class="message">
        My app
    </div>
    <i class="icon-spinner icon-2x icon-spin active"></i>
</div>

А затем составьте его из своей оболочки -

<div data-bind="if: showSplash">
    <!-- ko compose: 'splashpage.html' -->
    <!-- /ko -->
</div>

И в вашей модели просмотра вы должны переключать наблюдаемый showSplash всякий раз, когда вы хотите показать / скрыть его -

var showSplash = ko.observable(false);

var shell = {
    showSplash: showSplash
};
return shell;

И вы можете вызвать это из ваших методов активации внутри других ваших моделей просмотра, например:

define(['shell'], function (shell) {

    function activate() {
        shell.showSplash(true);
        // do something
        shell.showSplash(false);
    }

});
person PW Kad    schedule 19.12.2013
comment
Возможно, мое использование термина «Экран-заставка» было не лучшим выбором. Эта композиция - лишь небольшая часть моего приложения. Родительская модель просмотра не является оболочкой, и таких родительских моделей также может быть несколько. И в любом случае, для модели представления детей неуместно отвечать за такое поведение. - person Shaun Rowan; 20.12.2013
comment
Применяется тот же фундаментальный подход - вы просто хотите вызвать его из какой-то другой области, а не из дочерних моделей представления. Мой код предназначен для использования в качестве псевдокода, чтобы помочь вам найти решение, которое будет работать для вашего приложения. - person PW Kad; 20.12.2013
comment
Думаю, это разумное решение. А как насчет абстрагирования логики отображения / скрытия в модель базового представления? Таким образом, логика приложения не должна быть связана с этой функциональностью. - person Joseph Gabriel; 20.12.2013
comment
Согласитесь, это разумно. Надеюсь, будет добавлена ​​встроенная поддержка, чтобы детям не нужно было реализовывать какое-либо особое поведение, чтобы это произошло. - person Shaun Rowan; 26.12.2013

Мне это кажется сценарием, в котором может быть полезен пользовательский transition. Когда механизм композиции переключает узлы в DOM и из нее, он может использовать переход.

На этой странице в разделе «Дополнительные настройки»> «Переход» (примерно на полпути вниз) описывается настраиваемый переход: http://durandaljs.com/documentation/Using-Composition/

person Joseph Gabriel    schedule 19.12.2013
comment
Разве переход не начнется после завершения активации? Мне нужно, чтобы это происходило, пока работает активировать. - person Shaun Rowan; 20.12.2013
comment
Я согласен с @Joseph Gabriel, это звучит как хороший вариант использования пользовательского перехода. Взгляните на gist.github.com/jstott/6326038, основанный на начальные переходы CSS3 для Durandal 1.2. Кроме того, я бы, вероятно, выбрал индикатор загрузки, который активируется всякий раз, когда вы меняете представления. - person RainerAtSpirit; 20.12.2013
comment
@ShaunRowan - вы правы. Переход начинается после завершения активации. Я не уверен, что понимаю причину такого поведения - кажется, переход начнется раньше в процессе, а не после полной активации страницы. Я еще разберусь с этим - может быть, я что-то упускаю. - person Joseph Gabriel; 20.12.2013
comment
@JosephGabriel. Можете ли вы добавить свое открытие в github.com/BlueSpire/Durandal/issues/414 как хорошо? - person RainerAtSpirit; 21.12.2013