7

[これは、新しい 1.0.0-pre.4+ ルーターに関するものです。]

Ember Route のメソッドから、読み込みに非同期コールバックが必要なレコードを返したいと考えて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)
4

2 に答える 2

4

Travis CIを最新の ember バージョンに書き直している最中ですが、同じ問題に直面しましたemberjs/ember.js。主キーではないスラッグ (例: ) でリポジトリをフェッチします。私の解決策は、を使用することEmber.ProxyObjectです。

誰かが のようなパスに入る/emberjs/ember.jsと、パラメータは次のようになります。

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

したがって、スラッグは に等しくなりemberjs/ember.jsます。

slugこのような情報を使用して、isLoadedプロパティを保持するだけの単純な Ember オブジェクトを作成します。

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

次に、このオブジェクトをコンテンツとしてプロキシを作成します。

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

これで、slug を使用してサーバーからレコードをロードし、プロキシをモデルとして返すことができます。サーバーからレコードを取得したら、プロキシ コンテンツを実際のレコードに設定するだけです。

完全なソリューションは次のとおりです。

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

githubで残りのコードを確認することもできます

于 2013-02-20T14:54:44.170 に答える
0

モデルの isLoaded ステータスで、モデル自体にオブザーバーを追加してから呼び出すのはどうですかblog.get(property)

blogReady: function() {
  if(this.get('isLoaded') {
     // switch logic
  }
}.observes('isLoaded')
于 2013-02-11T17:44:57.037 に答える