js-在单条路线中数据多个模型

时间:2016-10-11 21:08:36

标签: javascript jsdata

我正在使用3.0.0-rc.4的js-data,我需要从一次调用到后端API加载多个模型。我还在构建后端,并且希望能够一次从不同的表中检索所有数据,而不是多次调用不同的端点。

1 个答案:

答案 0 :(得分:2)

你可以。假设您的Web应用程序尝试加载的路径是/ posts / 123,您需要加载Post#123及其注释,它们位于两个不同的表中。在您的客户端应用程序中,您可以执行类似

的操作
store.find('post', 123)

甚至

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

会分别向/post/123/post/123?with=comment发出GET请求。

你的后端可以回复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,它可以正确解析查询字符串并为您的所有Mapper生成所有Express路由。使用js-data-express,您的后端将能够完全按照我在上面的示例中指出的那样响应请求。

将数据加载到内存存储中后,View组件可以从内存存储中提取所需的数据:

从内存商店中获取Post#123:

store.get('post', 123)

从内存商店中获取帖子#123的评论:

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

如果您使用的是DataStore组件,那么Post的评论也应该可以在Post记录本身上使用,例如: post.comments