Асинхронная маршрутизация Emberjs

Моя проблема связана с проблемами # 1183 и # 1268 emberjs.

У меня есть динамический элемент на маршрутах. Все нормально, если я перемещаю приложение throuht. Проблема в том, что я перезагружаю страницу или когда тип url. В этом случае приложение вводит функцию десериализации, а также нагрузку и объект по их идентификатору, но эта загрузка является асинхронной.

В вопросе # 1268 lukemelia говорит: "вам нужно будет сделать результат вашего метода десериализации для реализации шаблона promises".

Я пробовал, но всегда терял контекст. Мой код похож на:

page: Ember.Route.extend
route: '/:alias'
deserialize: (router, params) -> page=App.Page.find(params.alias)
$.when( page.get("isLoaded") ).done( () -> console.debug(page.get("alias")) return page)
loading: Em.State.extend

Маршрутизатор переходит в состояние загрузки, а затем возвращается без контекстных данных. Я думаю, что я делаю что-то неправильно. Возможно, все не так.

Может кто-нибудь мне помочь? Есть ли и пример?

Спасибо!

Решено:

page: Ember.Route.extend
    route: '/:id'
    deserialize: (router, params) ->
        page=App.Page.find(params.id})
        deferred = $.Deferred()
        page.addObserver("isLoaded", -> deferred.resolve(page))
        return deferred.promise()
    serialize: (router, page) ->
        return {id: page.get("id") }
    connectOutlets: (router, page) ->
        router.get('applicationController').connectOutlet
            context: page
            name: "page"
loading: Em.State.extend
    connectOutlets: (router, context) ->
        router.get('applicationController').connectOutlet(context: context, name: "loading")

При загрузке страницы загружается активное состояние, при загрузке страницы автоматически загружается страница загрузки роутера.

Я надеюсь, что это может помочь кому-то

Ответ 1

@leroj7 вы поняли приемлемое решение. Спасибо, что поделились ею. Я создал mixin, который я добавляю к моделям, которые должны иметь такое поведение:

Editor.ModelPromise = {
  init: function() {
    this._super();
    this._deferred = $.Deferred();
    this._deferred.promise(this);
    this.one('didLoad', this, '_resolveModelPromise');
    this.one('becameError', this, '_rejectModelPromise');
  },
  _resolveModelPromise: function() {
    this._deferred.resolve(this);
  },
  _rejectModelPromise: function() {
     this._deferred.reject(this);
  }
};

Также доступен https://gist.github.com/1b54f0956ba10195a3bc

Подобный подход в конечном итоге будет испечен в ember-data, хотя, скорее всего, у него не будет зависимости jQuery, поскольку данные ember-данных в настоящее время не зависят от jQuery.