EmberJS hasMany не получает отношения - PullRequest
0 голосов
/ 07 февраля 2019

У меня проблема с сериализацией моего ответа, который выглядит следующим образом:

{
"data": [
    {
        "id": 930,
        "uniqueId": "0d3a04cb-231c-4998-b4d3-9436a0a3138e",
        "name": "DRINKI",
        "lastEditDate": "2018-02-12T13:30:32",
        "lastEditDateUTC": "2018-02-12T12:30:32",
        "deleted": false,
        "discountable": true,
        "productCategoryPointOfSales": []
    },
    {
        "id": 921,
        "uniqueId": "5fbf423a-4932-47ca-b32f-5d3612dd73ee",
        "name": "BALOTYNKI SOLO",
        "lastEditDate": "2019-02-07T14:20:15",
        "lastEditDateUTC": "2019-02-07T13:20:15",
        "deleted": false,
        "label": "",
        "color": "#a0a5a9",
        "discountable": true,
        "productCategoryPointOfSales": [
            {
                "id": 142,
                "pointOfSaleUniqueId": "98e370f2-9d37-4473-9446-d82e442593fe",
                "directionId": 54,
                "directionUniqueId": "f0c986c0-ef85-4a46-86ea-cd997981fe8a",
                "kitchenUniqueId": "f0c986c0-ef85-4a46-86ea-cd997981fe8a",
                "inactive": false
            }
        ]
    }
],
"total": 0
}

И получаю ошибку:

Encountered a relationship identifier without a type for the hasMany relationship 'productCategoryPointOfSales' on <category:5fbf423a-4932-47ca-b32f-5d3612dd73ee>, expected a json-api identifier with type 'product-category-point-of-sale' but found '{"id":"142","pointOfSaleUniqueId":"98e370f2-9d37-4473-9446-d82e442593fe","directionId":54,"directionUniqueId":"f0c986c0-ef85-4a46-86ea-cd997981fe8a","kitchenUniqueId":"f0c986c0-ef85-4a46-86ea-cd997981fe8a","inactive":false}'. Please check your serializer and make sure it is serializing the relationship payload into a JSON API format.

Модели:

export default DS.Model.extend({
productCategoryPointOfSales: DS.hasMany('product-category-point-of-sale'),

uniqueId: DS.attr('string'),
name: DS.attr('string'),
label: DS.attr('string'),
color: DS.attr('string'),
discountable: DS.attr('boolean')
});

export default DS.Model.extend({
category: DS.belongsTo('category'),

pointOfSaleUniqueId: DS.attr('string'),
directionId: DS.attr('string'),
directionUniqueId: DS.attr('string'),
kitchenUniqueId: DS.attr('string'),
inactive: DS.attr('boolean')
});

И мой сериализатор:

export default DS.RESTSerializer.extend(EmbeddedRecordMixin, {
normalizeResponse(store, primaryModelClass, payload, id, requestType) {
payload = {
  category: payload.data,
};

return this._super(store, primaryModelClass, payload, id, requestType);
},
primaryKey: 'uniqueId',

attrs: {
  productCategoryPointOfSales: {embedded: 'always'}
}
});

Я очень плохо знаком с EmberJS и не знаю, как решить эту проблему.Я следовал некоторым учебникам и попробовал использовать EmbeddedRecordMixin, но это мне не помогло.Не могли бы вы помочь мне выяснить это?

1 Ответ

0 голосов
/ 08 февраля 2019

Ваша полезная нагрузка API не соответствует тому, что по умолчанию ember-data JSONAPISerializer ожидает (нет type attribute => ошибка отсутствующего типа).
Вы опубликовали собственный сериализатор на основе RESTSerializer,но, похоже, он не в нужном месте, поэтому ember-data по-прежнему использует JSONAPISerializer по умолчанию.Также вам может быть лучше использовать JSONSerializer .

Поскольку ваша полезная нагрузка имеет различные атрибуты для идентификатора записи (uniqueId и pointOfSaleUniqueId), вам необходимо создать собственные сериализаторы для модели,чтобы установить различные primaryKey и особенности встроенных записей.

Я создал пример ember-twiddle , он имеет три сериализатора.

Сериализатор приложения, по умолчанию:

// /app/serializers/application.js
import JSONSerializer from 'ember-data/serializers/json';

export default JSONSerializer.extend({
  // use uniqueId as ember-data model id
  primaryKey: 'uniqueId',

  normalizeResponse(store, primaryModelClass, payload, id, requestType) {
    // extract data from payload, so JSONSerializer finds the records
    let normalizedPayload = payload.data;

    // call the JSONSerializer.normalizeResponse with the extracted payload
    return this._super(store, primaryModelClass, normalizedPayload, id, requestType);
  }
});

Для модели category для поддержки встроенного productCategoryPointOfSales расширить сериализатор приложения и добавить EmbeddedRecordsMixin:

// /app/serializers/category.js
import ApplicationSerializer from './application';
import EmbeddedRecordsMixin from 'ember-data/serializers/embedded-records-mixin';

export default ApplicationSerializer.extend(EmbeddedRecordsMixin, {
  attrs: {
    productCategoryPointOfSales: { embedded: 'always' }
  }
});

Для productCategoryPointOfSale, чтобы использоватьдругой primaryKey:

// /app/serializers/product-category-point-of-sale.js
import ApplicationSerializer from './application';

export default ApplicationSerializer.extend({
  primaryKey: 'pointOfSaleUniqueId'
});
...