2013-02-11 14 views
7

[これは新しい1.0.0-pre.4 +ルータについてです。]エンバールータ:非同期モデル(約束?)

私はエンバールートのmodelメソッドからの非同期コールバックを必要とするレコードを返すようにしたいですたとえば、複数の(ネストされた)モデルをロードする必要があるためです。これを行う最善の方法は何ですか?ここで


問題を示して架空のブログのアプリからのサンプルコードです:

App.Router.map -> 
    @resource 'filteredArticles', path: '/:filter' 

App.FilteredArticlesRoute = Ember.Route.extend 
    model: (params) -> 
    blog = App.Blog.find(1) # get the user's Blog singleton 
    property = switch params.filter 
     when 'published' then 'publishedArticles' 
     when 'draft' then 'drafts' 
     when 'all' then 'articles' 
    # Return the list of articles from the `blog` record. 
    # But `blog` hasn't necessarily finished loading :(
    blog.get(property) 
+0

限り、コードの残りの部分でそれを見てみることができます非同期にフェッチされる別の約束を返します。 –

+0

私はそうしたいと思いますが、更新されない空の配列を返します。つまり、 'App.Blog.find(1).get( 'articles')'を再実行しても空ではない配列が返されます。私にはgithubの問題のようなより多くのを感じ –

+0

:) –

答えて

4

私は、最新の燃えさしバージョンにTravis CIを書き換えの真ん中にいると私は同じ問題に直面して - 私たちは、スラグによってリポジトリをフェッチ(例えば、 emberjs/ember.js)、これは主キーではありません。私の解決策はEmber.ProxyObjectです。誰かが/emberjs/ember.jsようなパスを入力すると

は、paramsが次のようになります。

{ owner: 'emberjs', name: 'ember.js` } 

ので、スラグはemberjs/ember.jsに等しくなります。そのような情報で

、私はちょうどslugisLoaded性質を保持し、簡単なエンバーオブジェクトを作成:

content = Ember.Object.create slug: slug, isLoaded: false 

それから私は、コンテンツとして、このオブジェクトとプロキシを作成します。

プロキシ= Ember.ObjectProxy .create(コンテンツ:コンテンツ)

今私はスラグを使用して、サーバーからレコードをロードし、モデルとしてプロキシを返すことができます。サーバーからレコードを取得するときは、単にプロキシのコンテンツを実際のレコードに設定します。

完全なソリューションはここにある:私はあなただけ `blog.get(プロパティ)を返すかどうかを知るよう

deserialize: (params) -> 
    slug = "#{params.owner}/#{params.name}" 
    content = Ember.Object.create slug: slug, isLoaded: false 
    proxy = Ember.ObjectProxy.create(content: content) 

    repos = Travis.Repo.bySlug(slug) 

    observer = -> 
    if repos.get 'isLoaded' 
     repos.removeObserver 'isLoaded', observer 
     proxy.set 'content', repos.objectAt(0) 

    if repos.length 
    proxy.set('content', repos[0]) 
    else 
    repos.addObserver 'isLoaded', observer 

    proxy 

あなたはまた` on github

0

あなたがモデルのisLoaded状況に、モデル自体にオブザーバを追加し、blog.get(property)を呼び出す方法について

blogReady: function() { 
    if(this.get('isLoaded') { 
    // switch logic 
    } 
}.observes('isLoaded') 
関連する問題