我正在使用Ember 3.1和JSON:API格式从后端获取数据。
我的模型如下:
// Continent model
export default DS.Model.extend({
name: attr('string'),
countries: hasMany('countries'),
});
// Country model
export default DS.Model.extend({
name: attr('string'),
president: belongsTo('president'),
regions: hasMany('region')
});
// President model
export default DS.Model.extend({
name: attr('string')
});
// Region model
export default DS.Model.extend({
name: attr('string')
});
获取模型的方式:
fetchInformation: task(function* () {
yield get(this, 'store')
.findRecord('continent', continent,
{
include: 'countries,'
+ 'countries.president,'
+ 'countries.regions'
}
).then((continent) => {
get(continent, 'countries.firstObject') // This one gets resolved properly
get(continent, 'countries.firstObject.president') // Get Proxy object
get(continent, 'countries.firstObject.regions.firstObject') // Get Proxy object
})
我认为,通过使用'include'和服务器以JSON:API规范的形式答复,我将可以访问所有这些属性。
在我看来,那些嵌套关系需要以某种方式得到解决。
我想念什么?有什么方法可以轻松使用嵌套模型?
答案 0 :(得分:0)
好吧,在hasMany和belongsTo中添加{async:false}似乎可以解决问题。
// Continent model
export default DS.Model.extend({
name: attr('string'),
countries: hasMany('countries', {async: false}),
});
// Country model
export default DS.Model.extend({
name: attr('string'),
president: belongsTo('president', {async: false}),
regions: hasMany('region', {async: false})
});
// President model
export default DS.Model.extend({
name: attr('string')
});
// Region model
export default DS.Model.extend({
name: attr('string')
});