js-data能否在嵌套对象上创建关系?这是一个例子:
GET / card / 2
{
"id": 2,
"name": "foo",
"action": { // <-- nested object
"typeId": 1, // foreign key to actionType.id
"param0": 20
}
}
GET / action-types
[{
"id": 1,
"name": "Jump",
"paramsMeta": [{
"name": "Distance",
"max": 30
}]
}, {
"id": 2,
"name": "Damage",
"paramsMeta": [{
"name": "amount",
"min": 0
}, {
"name": "isRelative",
"type": "Boolean"
}]
}]
resources.js:
DS.defineResource({
name: 'card',
relations: {
hasOne: {
actionType: {
localField: 'action.type',
localKey: 'action.typeId'
}
}
}
});
DS.defineResource(
name: 'actionType',
endpoint: 'action-types'
);
我需要的是初始化属性card.action.type
。但是在当前示例中,属性card['action.type']
已初始化,并且不是我想要的。更具体地说,js数据处理之后的当前card
对象是:
> console.log(DS.get('card', 2));
>
{
id: 2,
name: 'foo',
'action.type': { id: 1, name: 'Jump', ... } // <-- reference to actionType
action: {
typeId: 1, param0: 20
}
}
但我需要这样的结构:
> console.log(DS.get('card', 2));
>
{
id: 2,
name: 'foo',
action: {
typeId: 1,
type: { id: 1, name: 'Jump', ... }, // <-- reference to actionType
param0: 20
}
}
js-data version:2.9.0
答案 0 :(得分:0)
您需要从hasOne
切换到belongsTo
关系,例如:
belongsTo: {
'action-type': {
localField: 'action.type',
localKey: 'action.typeId'
}
}
以下是尝试执行您想要的操作的两个掠夺者:
js-data v2:http://plnkr.co/edit/nbZtaXZ8AZwh9ITiG1kO?p=preview(嵌套路径上的关系,不能正常工作)
js-data v3:http://plnkr.co/edit/Tyxsab0icCs8nn68fkta?p=preview(嵌套路径上的关系,不能正常工作)
不幸的是,JSData无法为action.type
这样的嵌套路径创建ES5 getter,因此链接根本无法按预期工作。 (嗯,确实是一个吸气剂,但它最终成为一个名为action.type
的属性,而不是你想要的。)
一种解决方法是定义一个中间行动&#34;资源,并有 以下关系:
唯一需要注意的是card.action
现在需要有一个主键。最简单的
简单地让card.action.id
等于card.id
。
以下是两个演示此解决方法的掠夺者:
js-data v2:http://plnkr.co/edit/cUDyP0Zmk39zP30sTVpL?p=preview(嵌套路径上的关系,使用中间资源解决)
js-data v3:http://plnkr.co/edit/J8yNL9zIp5h9RJL9XM9w?p=preview(嵌套路径上的关系,使用中间资源解决)