Доступ к данным отношений hasMany / belongsTo с помощью JSONAPI

#javascript #ember.js #ember-data #json-api

#javascript #ember.js #ember-данные #json-api

Вопрос:

Не могли бы вы мне помочь, пожалуйста?

У меня есть канал модели, функция модели, приложение канала модели и функция приложения модели. И я определил их следующим образом:

Моя модель channel.js :

 import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { hasMany } from 'ember-data/relationships';

export default Model.extend({
  name: attr('string'),
  key: attr('string'),
  multiplePages: attr('boolean'),
  features: hasMany('feature', { async: true })
});
  

Моя модель feature.js :

 import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { hasMany } from 'ember-data/relationships';

export default Model.extend({
  name: attr('string'),
  key: attr('string'),
  applicationFeatures: hasMany('application-feature', { async: true }),
  channels: hasMany('channel', { async: true })
});
  

Моя модель channel-application.js :

 import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo, hasMany } from 'ember-data/relationships';

export default Model.extend({
  name: attr('string'),
  clientId: attr('string'),
  channel: belongsTo('channel'),
  applicationFeatures: hasMany('application-feature', { async: true })
});
  

Моя модель application-feature.js

 import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { belongsTo } from 'ember-data/relationships';

export default Model.extend({
  scope: attr('string'),
  connectType: attr('string'),
  channelApplication: belongsTo('channel-application', { async: true }),
  feature: belongsTo('feature', { async: true })
});
  

Я использую JSONAPI. И в моем маршруте я делаю это:

 model() {
    return Ember.RSVP.hash({
      profiles: this.store.findAll('profile'),
      channels: this.store.findAll('channel'),
      channelApplications: this.store.query('channel-application', { filter: { feature: 'inbox'} })
   })
}
  

Итак, в моем шаблоне мне нужно получить my ChannelApplications и для каждого из них мне нужно знать Channel , что связано с этим ChannelApplications , и знать каждого ApplicationFeature .

 {{#each channelApplications as |channelApplication|}}
    {{channelApplication.id}}

    // I think in something like this, but this doesn't work of course
    {{#each channelApplication.channels as |channel|}}
       <span>{{channel.id}}</span>
       <span>{{channel.name}}</span>
       {{#each channelApplication.applicationFeatures as |applicationFeature|}}
          <span>{{applicationFeature.id}}</span>
          <span>{{applicationFeature.name}}</span>
        {{/each}}
    {{/each}}

{{/each}}
  

channelApplication.applicationFeatures и channelApplication.channels ничего не возвращают.

Когда я печатаю {{channelApplication.applicationFeatures.length}} , он возвращает 0.

Когда я печатаю {{channelApplication.applicationFeatures}} , он выводит <DS.PromiseManyArray>

JSONAPI возвращает для channelApplications: this.store.query('channel-application', { filter: { feature: 'inbox'} }) :

 {
   "data":[
      {
         "type":"channel-applications",
         "id":"2",
         "attributes":{
            "name":"Application1",
            "channel-id":1,
            "client-id":"123"
         },
         "relationships":{
            "application-features":{
               "data":[
                  {
                     "type":"application-features",
                     "id":"3"
                  }
               ]
            }
         }
      },
      {
         "type":"channel-applications",
         "id":"4",
         "attributes":{
            "name":"Application2",
            "channel-id":2,
            "client-id":"456"
         },
         "relationships":{
            "application-features":{
               "data":[
                  {
                     "type":"application-features",
                     "id":"7"
                  }
               ]
            }
         }
      },
      {
         "type":"channel-applications",
         "id":"5",
         "attributes":{
            "name":"Application3",
            "channel-id":3,
            "client-id":"001"
         },
         "relationships":{
            "application-features":{
               "data":[
                  {
                     "type":"application-features",
                     "id":"9"
                  },
                  {
                     "type":"application-features",
                     "id":"10"
                  },
                  {
                     "type":"application-features",
                     "id":"11"
                  },
                  {
                     "type":"application-features",
                     "id":"12"
                  }
               ]
            }
         }
      }
   ],
   "included":[
      {
         "type":"application-features",
         "id":"3",
         "attributes":{
            "channel-application-id":2,
            "feature-id":3,
            "scope":"teste1, teste2, teste3",
            "connect-type":"script"
         }
      },
      {
         "type":"application-features",
         "id":"7",
         "attributes":{
            "channel-application-id":4,
            "feature-id":3,
            "scope":"",
            "connect-type":"redirect"
         }
      },
      {
         "type":"application-features",
         "id":"9",
         "attributes":{
            "channel-application-id":5,
            "feature-id":1,
            "scope":"teste4, teste5",
            "connect-type":"redirect"
         }
      },
      {
         "type":"application-features",
         "id":"10",
         "attributes":{
            "channel-application-id":5,
            "feature-id":2,
            "scope":"",
            "connect-type":"password"
         }
      },
      {
         "type":"application-features",
         "id":"11",
         "attributes":{
            "channel-application-id":5,
            "feature-id":3,
            "scope":"",
            "connect-type":"password"
         }
      },
      {
         "type":"application-features",
         "id":"12",
         "attributes":{
            "channel-application-id":5,
            "feature-id":4,
            "scope":"",
            "connect-type":"password"
         }
      }
   ]
}
  

Итак, кто-нибудь знает о чем-нибудь, что я делаю неправильно, пожалуйста?

Ответ №1:

Ваш ответ неверен JSONAPI . Также неясно: имеет ли a channel-application один или несколько channel s?

Потому channel: belongsTo('channel'), что это означает, что у него есть один channel , но тогда вам не нужно перебирать их подобным {{#each channelApplication.channels as |channel|}} образом.

Если у вас есть один channel , вы не можете возвращать "channel-id":1, его как атрибут, но должны возвращать отношение:

 channel: {
  data: {
    type: 'channel',
    id: '1'
  }
}