Может ли js задержать сопоставление маршрутов / запускать вручную?

У меня есть элемент управления, настроенный так:

  1. Отображает загруженный вид асинхронно.
  2. Данные для представления также загружаются асинхронно.
  3. Слушает изменения маршрута. Один из обработчиков маршрута отображает модальное с деталями модели, загруженной на шаге 2.

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

can.Control({
    init: function() {
       can.view('file.ejs', {pages: app.Model.Page.findAll()}, function(frag){
          // inject the fragment into DOM
       });
    },
    'page/:id/comments route': function() {
       // find the page in the list of models loaded, than display the modal
    }
});

Как мне снова запустить distcher или заставить контроллер пройти по маршрутам после рендеринга вида?

1 ответ

Если вы храните Deferred, который findAll возвращает куда-то, вы можете использовать это в своем маршруте, чтобы сообщить, когда он загружен.

http://canjs.com/docs/can.when.html

Вот пример, который хранит страницы в this.pages в элементе управления:
(не очень приятно смотреть, но легко понять)

can.Control({
    init: function() {
        this.pages = app.Model.Page.findAll()
        can.view('file.ejs', {pages: pages}, function(frag){
            // inject the fragment into DOM
        });
    },
    'page/:id/comments route': function() {
        can.when(this.pages).then(function(pages){
            // find the page in the list of models loaded, than display the modal
        })
    }
});
Другие вопросы по тегам