【问题标题】:js-data multiple models in a single routejs-data 单个路由中的多个模型
【发布时间】:2016-10-11 21:08:35
【问题描述】:

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

【问题讨论】:

    标签: javascript jsdata


    【解决方案1】:

    你可以。假设您的 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 帖子和 cmets 之间的关系,它们就会被缓存到内存存储的正确部分。例如:

    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,您的后端将能够完全按照我在上面的示例中指示的方式响应请求。

    一旦您将数据加载到内存存储中,您的视图组件就可以从内存存储中提取它需要显示的数据:

    从内存存储中取出 Post #123:

    store.get('post', 123)
    

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

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

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

    【讨论】:

    • 很好的答案!不过,我还有一个后续问题。所以js-data足够聪明,可以从接收到的数据中解析出复数,因为示例中的存储对象是'comment',但接收到的嵌套字段是'cmets'?
    • JSData 通过关系定义中的“localField”设置知道哪个字段是嵌入关系。
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多