сериализация отношений ember-data

Итак, это мой ответ json:

вещь:

{
    "data": {
        "id": 1,
        "username": "rodzzlessa",
        "slug": "rodzzlessa"
     }
}

коллекция:

{
"data": [
    {
        "id": 34,
        "name": "HDG common nails 50lbs",
        "slug": "hdg-common-nails-50lbs4569",
        "description": "Accusantium ipsam impedit omnis sint dolorum.",
        "image_src": "nail-box-angle.png",
        "categories": {
            "data": [
                {
                     "id": 2,
                     "name": "nails",
                    "image_src": "nails-icon.png"
                }
             ]
         }
     }
  ]
}

Я смог сделать сериальчик для основного ответа:

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
    extractArray: function(store, typeClass, payload) {
        payload.products = payload.data;
        delete payload.data;

        return this._super(store, typeClass, payload);
    }
});

Все отлично работает, с чем у меня проблема, так это с отношениями в данном случае categories: DS.hasMany('category'). Ошибка, которую я получаю:

A (subclass of DS.Model) record was pushed into the store with the value of categories being '{data: [object Object]}', but categories is a hasMany relationship so the value must be an array.

Итак, мои вопросы: какой метод мне следует отредактировать, чтобы иметь возможность сериализовать отношение так же, как я сделал это с его родителем? Я добавил DS.EmbeddedRecordsMixin, чтобы упростить себе жизнь в отношениях.


person ThreeAccents    schedule 01.06.2015    source источник
comment
Разве вы не можете справиться с этим тем же методом: extractArray? Это не идеально, но у вас есть доступ к полезной нагрузке. Я бы создал такую ​​функцию, как normalizeRelatedArrays, перебирал ключи полезной нагрузки, искал дочерние элементы, содержащие ключ data в качестве значения, и удалял его. В конце концов, Ember ожидает иметь категории: [ {... item 1}, {... item 2}]   -  person enspandi    schedule 01.06.2015
comment
@enspandi, не могли бы вы рассказать больше? Если не возражаете, можно пример?   -  person ThreeAccents    schedule 01.06.2015


Ответы (1)


Если я правильно понял, ошибка возникает из-за наличия объекта и внутри ключа categories:

A (subclass of DS.Model) record was pushed into the store with the value of categories being '{data: [object Object]}', but categories is a hasMany relationship so the value must be an array.

Поэтому вам нужно извлечь массив из этого блока с categories: { "data": [...] } по categories: [...].

Вы можете просто перебирать полезную нагрузку следующим образом:

var idx, key, item;
var len = payload.data.length;
for (idx=0; idx<len; idx++) {
  item = payload.data[idx];
  for (key in item) {
    if (item[key].hasOwnProperty('data')) {
      item[key] = item.data;
    }
  }
}
person enspandi    schedule 02.06.2015