0

js-data 可以在嵌套对象上创建关系吗?这是一个例子:

获取/卡片/2

{
  "id": 2,
  "name": "foo",
  "action": {     // <-- nested object
    "typeId": 1,  // foreign key to actionType.id
    "param0": 20
  }
}

获取/动作类型

[{
  "id": 1,
  "name": "Jump",
  "paramsMeta": [{
     "name": "Distance",
     "max": 30
  }]
}, {
  "id": 2,
  "name": "Damage",
  "paramsMeta": [{
    "name": "amount",
    "min": 0
  }, {
    "name": "isRelative",
    "type": "Boolean"
  }]
}]

资源.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']已初始化,这不是我想要的。具体来说,cardjs-data处理后的当前Object为:

> 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数据版本:2.9.0

4

1 回答 1

0

问题

您需要从 a 切换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 无法为嵌套路径创建 ES5 getter action.type,因此链接根本无法按预期工作。(好吧确实是一个吸气剂,但它最终成为一个名为 的属性action.type,而不是你想要的)。

解决方法

一种解决方法是定义一个中间“动作”资源,并具有以下关系:

  • 卡属于行动
  • 行动有一张牌
  • 动作属于动作类型
  • actionType hasMany 动作

唯一需要注意的是card.action现在需要有一个主键。最简单的事情就是简单地card.action.id等于card.id

以下是演示此解决方法的两个 plunker:

js-data v2:http ://plnkr.co/edit/cUDyP0Zmk39zP30sTVpL?p=preview (嵌套路径的关系,使用中间资源解决)

js-data v3:http ://plnkr.co/edit/J8yNL9zIp5h9RJL9XM9w?p=preview (嵌套路径的关系,使用中间资源解决)

于 2016-05-25T19:18:47.757 回答