11

私の問題は、emberjsの問題#1183#1268に関連しています。

ルートに動的要素があります。アプリケーションをナビゲートすれば、すべて問題ありません。問題は、ページをリロードするとき、またはURLを入力するときです。その場合、アプリは逆シリアル化関数に入り、IDでオブジェクトをロードしますが、このロードは非同期です。

問題#1268で、lukemeliaは「deserializeメソッドの結果に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")

ページのロード中はアクティブ状態がロード中ですが、ページのロードが完了すると、ルーターはページの状態を自動的にロードします。

これが誰かに役立つことを願っています

4

1 に答える 1

5

@leroj7あなたは実行可能な解決策を見つけました。共有していただきありがとうございます。この動作をするために必要なモデルに追加するミックスインを作成しました。

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に組み込まれますが、ember-dataは現在jQueryに依存していないため、jQueryに依存していない可能性があります。

于 2012-09-10T00:43:15.370 に答える