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
,