我是jsonapi的新手,也是结构如何工作并试图正确加载关系的新手。我希望余烬数据遵循关系中提供的 url.links 以获取所需的信息,但我得到了意想不到的结果。
我有如下定义的用户、区域和用户/区域关系:
// User Model
const UserModel = DS.Model.extend({
username: DS.attr('string'),
territories: DS.hasMany('user-territories')
}
// Territory Model
const TerritoryModel = DS.Model.extend({
name: DS.attr('string')
}
// User-Territory Model
const UserTerritoryModel = DS.Model.extend({
notes: DS.attr('string'),
startDate: DS.attr('date'),
user: DS.belongsTo('user'),
territory: DS.belongsTo('territory')
}
然后我有模拟数据(使用 http-mock(,如下所示:
// api/users/
data: {
type: "users",
id: 1,
attributes: {
username: "thisIsMyUsername"
}
},
relationships: {
territories: {
links: {
self: "http://localhost:4200/api/users/1/territories"
}
}
}
// api/users/1/territories
data: {
type: "user-territories",
id: 1,
attributes: {
notes: "This is a note",
startDate: "2017-01-01"
}
},
relationships: {
user: {
link: {
self: "http://localhost:4200/api/users/1"
}
},
territory: {
link: {
self: "http://localhost:4200/api/territories/1"
}
}
}
// api/territories/1
data: {
type: "territories",
id: 1,
attributes: {
name: "Territory #1"
}
}
在我的用户路由中,我想请求用户模型并有权访问用户区域关系数据和区域本身。api调用不是我所期望的:
this.get('store').findRecord('user', 1, { include: "territories" });
预期:
- API/用户/1
- API/用户/1/地区
实际:
- API/用户/1
- API/用户/1?包含=地区
如果我调用用户区域模型,我会得到这个:
预期:
- API/用户/1/地区
实际:
- API/用户区域/1
如果你使用included
,ember-data基本上认为你想告诉服务器旁加载数据。如果您返回links
,只需解决关系即可。但是relationships
必须在data
内。此外,self
链接用于关系本身,以返回数据使用related
。
所以首先你做一些类似 user = store.findRecord('user', '1')
,这将提取到api/users/
。然后你应该返回如下的东西:
// api/users/
{
data: {
type: "users",
id: 1,
attributes: {
username: "thisIsMyUsername"
}
relationships: {
territories: {
links: {
related: "http://localhost:4200/api/users/1/territories"
}
}
}
}
}
接下来你做user.get('territories')
.这将返回一个承诺,并获取http://localhost:4200/api/users/1/territories
,或该相关链接中的任何内容。但是要知道,ember-data
希望您返回的内容user-territories
此处,因为这是您在territories: DS.hasMany('user-territories')
中指定的。您应该知道在没有第三个表的情况下可以直接对多对多关系进行建模ember-data
。