Не удалось получить ассоциацию hasMany

я использовал commit eaa1123 (Эмбер) и 508479d (ember-data) для создания файлов JS.

у меня есть следующий JSON, возвращенный из моего бэкэнда Rails, который генерируется с 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 }

но это не то, что я ожидал.

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

спасибо заранее.

1 ответов


Если вы использовали эту фиксацию, это означает, что вы находитесь в последней версии ember-data, которая составляет 11. Добавление встроенный: 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

это не напрямую связано, но в случае, если все, что я написал выше, терпит неудачу, затем добавьте это решение в микс Ассоциации BelongsTo не материализуются при использовании findAssociation и крючки extractHasMany для асинхронного HasMany: https://github.com/emberjs/data/issues/525

внутренние для тех, кто хочет быстро увидеть, где вещи определены в отношении вызова " приложение.магазин.адаптер.сериализатор.map'

когда мы называли ' App.магазин.адаптер.сериализатор.map', вызов сериализатора определен на строке 536 ниже, а карта находится в сети 696 во 2-й ссылка

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

в строке 67 в DS.RESTAdapter которая расширяет DS.Адаптер на сериализатор собственность для пункт DS.RESTSerializer где дополнительные функциональные возможности RestAdapter есть.

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