定义嵌套对象的关系

时间:2016-05-25 16:56:24

标签: jsdata

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

1 个答案:

答案 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;资源,并有 以下关系:

  • 卡属于行动
  • 动作有一张卡
  • action belongsTo actionType
  • actionType hasMany action

唯一需要注意的是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(嵌套路径上的关系,使用中间资源解决)