Определение отношений для вложенных объектов

Может ли JS-data создавать отношения для вложенных объектов? Вот пример:

GET / card / 2

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

GET / action-типы

[{
  "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']инициализируется, и это не то, что я хочу. Чтобы быть более конкретным, текущий cardобъект после обработки данных js:

> 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: 2.9.0

1 ответ

  1. Проблема

    Необходимо переключиться с отношения 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 для вложенного путиaction.type, поэтому ссылки просто не работают так, как ожидалось. (Ну, это действительно делает геттер , но в конечном итоге это свойство с именемaction.type, а не то, что вы хотите).

    Обход

    Одним из обходных путей могло бы быть определение промежуточного ресурса «действия» и
    следующее отношение:

    • карта принадлежит действию
    • действие hasone card
    • действие принадлежит actionType
    • actionType действие hasMany

    Единственное предостережение-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 (отношения на вложенном пути, решаемые с использованием промежуточного ресурса)