我正在使用 3.0.0-rc.4 的 js-data,我需要从一次调用后端 API 加载多个模型。我仍在构建后端,并且希望能够一次从不同的表中检索所有数据,而不是多次调用不同的端点。
问问题
707 次
1 回答
2
你可以。假设您的 Web 应用程序尝试加载的路由是 /posts/123,并且您需要加载 Post #123 及其评论,它们位于两个不同的表中。在您的客户端应用程序中,您可以执行类似的操作
store.find('post', 123)
甚至
store.find('post', 123, { params: { with: 'comment' } })
/post/123
这将分别向和之类的东西发出 GET 请求/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 组件可以从内存存储中提取它需要显示的数据:
从内存存储中获取 Post #123:
store.get('post', 123)
从内存存储中获取帖子 #123 的评论:
store.getAll('comment', 123, { index: 'post_id' })
如果您正在使用该DataStore
组件,那么 Post 的 Comments 也应该在 Post 记录本身上可用,例如post.comments
.
于 2016-10-16T16:37:05.680 回答