6

commit eaa1123(ember)と508479d(ember-data)を使用してJSファイルをビルドしました。

Railsバックエンドから次のJSONが返されます。これは、active_model_serializers(0.6.0)で生成されます。

{
  "posts": [
    {
      "id": 408,
      "title": "Lorem Ipsum",
      "body": "In at quo tempora provident nemo.",
      "comments": [
        {
          "id": 956,
          "body": "Quo incidunt eum dolorem."
        },
        ...
      ]
    }
  ]
}

および次のEmberモデル:

App.Post = DS.Model.extend({
  title: DS.attr('string'),
  body: DS.attr('string'),
  comments: DS.hasMany('App.Comment', {
    embedded: true
  })
});

App.Comment = DS.Model.extend({
  body: DS.attr('string'),
  post: DS.belongsTo('App.Post')
});

すべてが完全に正常に見えます:

post = App.Post.find(408);
post.get('title')
// => "Lorem Ipsum"

しかし、私はコメントに到達できないようです:

comments = post.get('comments')
comments.get('firstObject') instanceof App.Comment
// => true
comments.forEach(function(comment) {
  console.log(comment.get('body'))
})
//=> undefined

私が使用するとき:

comments.content

オブジェクトを含む配列を取得するので、次のようになります。

comments.content[0]
//=> { body: "Quo incidunt eum dolorem.", id: 956 }

しかし、これは私が期待したものではありません。

当たり前のようですので、何かおかしなことをしているに違いありません。副作用として:現在、テンプレートにコメントを簡単に表示することができないので、誰かがこれについて私を助けてくれることを願っています。

前もって感謝します。

4

1 に答える 1

10

そのコミットを使用した場合は、最新のember-dataリビジョン(11)を使用していることを意味します。embedded :true を追加して、埋め込みアソシエーションをロードすることは、リビジョン5または9の間に非推奨になりました。

デフォルトのrestAdapterを使用している場合は、関連付けオプションとしてではなく、以下に示すように埋め込み読み込みをマッピングとして定義する必要があります。

App.store = DS.Store.create({
  revision: 11,
  adapter: DS.RESTAdapter.create()
});

App.store.adapter.serializer.map('App.Post', {
   comments: {embedded: 'load'}
});

App.Post = DS.Model.extend({
  title: DS.attr('string'),
  body: DS.attr('string'),
  comments: DS.hasMany('App.Comment')
});

App.Comment = DS.Model.extend({
   body: DS.attr('string'),
   post: DS.belongsTo('App.Post')
});

以下のリンクから、これまでのすべての議論をたどることができます。

https://github.com/emberjs/data/issues/504#issuecomment-11256934 https://github.com/emberjs/data/pull/430#issuecomment-10925506

埋め込みレコードを読み込むためのさまざまな修正: https ://github.com/emberjs/data/pull/541

これは直接関連していませんが、上記のすべてが失敗した場合に備えて、このソリューションをミックスに追加します。 非同期HasManyにfindAssociationおよびextractHasManyフックを使用すると、BelongsToアソシエーションは実現されません: https ://github.com/emberjs/data/issues/525

'App.store.adapter.serializer.map'の呼び出しに関して、物事がどこで定義されているかをすばやく確認したい人のための内部

'App.store.adapter.serializer.map'を呼び出すと、シリアライザーの呼び出しは以下の536行目で定義され、マップは2番目のリンクでオンライン696になります。

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/adapter.js#L536 https://github.com/emberjs/data/blob/master/packages/ember -data / lib / system / adapter.js#L696

DS.Adapterを拡張するDS.RESTAdapterの67行 目で、serializerプロパティは、 RestAdapterに固有の追加機能が追加されたDS.RESTSerializerを指すように作成されています。

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L67

于 2013-01-05T12:49:07.530 に答える