#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'
}
}