JS-данные нескольких моделей в одном маршруте

Я использую 3.0.0-rc.4 из js-data, и мне нужно загрузить несколько моделей из одного вызова бэкэнд-API. Я все еще создаю бэкэнд и предпочел бы иметь возможность получать все данные из разных таблиц одновременно, а не делать несколько вызовов в разные конечные точки.

1 ответ

Вы можете. Скажем, маршрут, который пытается загрузить ваше веб-приложение, - /posts/123, и вам нужно загрузить Post #123 и его комментарии, которые находятся в двух разных таблицах. В своем клиентском приложении вы можете сделать что-то вроде

store.find('post', 123)

или даже

store.find('post', 123, { params: { with: 'comment' } })

который сделает запрос GET к чему-то вроде /post/123 а также /post/123?with=comment соответственно.

Ваш бэкэнд может ответить записью Post со встроенными комментариями, и, пока вы рассказали JSData о связи между публикациями и комментариями, каждый из них будет кэшироваться в правой части хранилища в памяти. Например:

store.defineMapper('post', {
  relations: {
    hasMany: {
      comment: {
        localField: 'comments',
        foreignKey: 'post_id'
      }
    }
  }
});
store.defineMapper('comment', {
  relations: {
    belongsTo: {
      post: {
        localField: 'post',
        foreignKey: 'post_id'
      }
    }
  }
});

Ты сделаешь:

store.find('post', 123)

Ваш бэкэнд отвечает:

{
  "id": 123,
  // ...
}

Ты сделаешь:

store.find('post', 123, { params: { with: 'comment' } })

Ваш бэкэнд отвечает:

{
  "id": 123,
  // ...,
  comments: [
    {
      "id": 14323,
      "post_id": 123,
      // ...
    },
    // ...
  ]
}

Если вы используете Node.js + JSData на сервере, тогда посмотрите https://github.com/js-data/js-data-express который может правильно проанализировать строку запроса и сгенерировать все маршруты Express для всех ваши мапперы. Используя js-data-express, ваш бэкэнд сможет отвечать на запросы именно так, как я указал в моих примерах выше.

После того как вы загрузили данные в хранилище в памяти, ваш компонент View может извлечь данные, необходимые для отображения, из хранилища в памяти:

Получить сообщение № 123 из хранилища в памяти:

store.get('post', 123)

Получите Комментарии к Посту № 123 из хранилища в памяти:

store.getAll('comment', 123, { index: 'post_id' })

Если вы используете DataStore Компонент, то комментарии к сообщению также должны быть доступны в самой записи сообщения, например, post.comments,

Другие вопросы по тегам