Ember не устанавливает атрибут отношения hasMany после получения данных - PullRequest
1 голос
/ 31 мая 2019

Предисловие: в этом проекте много нововведений, таких как создание моего первого API, первый раз с использованием JSON API, первый раз с использованием Ember, первая публикация на SO и т. Д.

Я пытаюсь получить доступ к атрибуту hasMany авторов в моем шаблоне, содержащем последние обновления. Что я получаю доступ к нему в шаблоне, однако, ничего не возвращается. Модели сохраняются корректно, но отношения не устанавливаются, они появляются, поскольку длина DS.PromiseManyArray в latest.contentAuthors равна 0, пока обещание выполнено ({ _length: 0, isFulfilled: true, isRejected: false }).

Я использую Ember 3.10 (с CLI). У меня есть полный контроль над моим бэкэндом (LAMP работает с ExpressionEngine 5), и я обслуживаю запросы API через специальный плагин, хотя я не уверен, что это имеет большое значение, так как кажется, что это во многом проблема внешнего интерфейса из того, что я могу различить.

Маршрут

import Route from '@ember/routing/route';

export default Route.extend({
    model(){
        let latest = this.store.peekAll('latest');
        if (latest.length < 2){
            latest = this.store.query('latest', { limit: 2, include: "people" });
        }
        return latest;
    }
});

Базовая модель

import DS from 'ember-data';
const { Model } = DS;

export default Model.extend({
    title: DS.attr()
});

Последняя модель
Редактировать: Удалено избыточное свойство, которого нет в исходном коде

import DS from 'ember-data';
import ExpressionEngineBase from './expression-engine-base';

export default ExpressionEngineBase.extend({
    blurb: DS.attr(),
    contentAuthors: DS.hasMany('person')
});

Модель лица
Редактировать: Удалено избыточное свойство, которого нет в исходном коде

import DS from 'ember-data';
import ExpressionEngineBase from './expression-engine-base';

export default ExpressionEngineBase.extend({
    latest: DS.hasMany('latest')
});

Template

{{#each this.model as |latest|}}
    <h2>{{latest.title}}</h2>
    {{#each latest.contentAuthors as |author|}}
        <div>{{author.title}}</div>
    {{else}}
        <div>Can't find author(s)</div>
    {{/each}}
    <p>{{latest.blurb}}</p>
{{/each}}

Данные отправлены с сервера
Редактировать: Проверено это с помощью валидатора JSON API , чтобы обнаружить, что оригинал не соответствует. Я обновил свой бэкэнд, но это не решило проблему. Это теперь соответствует в соответствии с этим валидатором.

{
    "data": [{
        "id": "3161",
        "type": "latest",
        "attributes": {
            "title": "Amazing Video 1"
        },
        "links": {
            "self": "https:\/\/cms.example.com\/api\/v1\/video\/3161"
        },
        "relationships": {
            "people": {
                "data": [{
                    "id": "1",
                    "type": "people"
                }]
            }
        }
    }, {
        "id": "2573",
        "type": "latest",
        "attributes": {
            "title": "Amazing Article 1"
        },
        "links": {
            "self": "https:\/\/cms.example.com\/api\/v1\/white_papers_insights\/2573"
        },
        "relationships": {
            "people": {
                "data": [{
                    "id": "1",
                    "type": "people"
                }, {
                    "id": "52",
                    "type": "people"
                }]
            }
        }
    }],
    "links": {
        "self": "https:\/\/cms.example.com\/api\/v1\/latest?include=people&limit=2"
    },
    "included": [{
        "id": "1",
        "type": "people",
        "links": {
            "self": "https:\/\/cms.example.com\/api\/v1\/people\/1",
            "channel": "https:\/\/cms.example.com\/api\/v1\/people"
        },
        "attributes": {
            "title": "Great Author"
        }
    }, {
        "id": "52",
        "type": "people",
        "links": {
            "self": "https:\/\/cms.example.com\/api\/v1\/people\/52",
            "channel": "https:\/\/cms.example.com\/api\/v1\/people"
        },
        "attributes": {
            "title": "Great Co-Author"
        }
    }]
}

Повторим, модель отношений сохраняется и отображается в Ember Inspector, но фактическая связь / отношение не устанавливается.

Обновление: Я попытался переименовать типы и параметры запроса безрезультатно, проверяя, не связано ли перегиба с пропущенным отношением.

1 Ответ

0 голосов
/ 01 июня 2019

Отношения в вашей модели называются contentAuthors, но в вашей полезной нагрузке вы называете это people.

Итак, вместо этого:

"people": {
  "data": [{
    "id": "1",
    "type": "people"
  }]
}

сделать это:

"contentAuthors": {
  "data": [{
    "id": "1",
    "type": "people"
  }]
}

Если в вашей модели contentAuthors: DS.hasMany('person').


sidenote: latest - это , а не хорошее название модели. Имя модели всегда должно быть существительным или, по крайней мере, заканчиваться одним.

...