Backbone.js& REST API资源关系&相互作用

时间:2012-09-27 11:18:07

标签: rest backbone.js relationship

我有一个小型REST API,由Backbone.js提供支持的单页面Web应用程序使用

API提供了两种资源类型,因此Backbone应用程序使用。这些是文章和评论。这两个资源具有不同的端点,每个文章都有一个链接到该项目的所有评论的位置。

我面临的问题是,在我的网络应用程序的文章列表中,我希望能够显示每篇文章的评论数量。鉴于只有在我获得评论列表时才能实现这一点,在当前设置中,需要我发出一个API请求以获取初始文章列表,并且每个文章的另一个请求能够计算数字评论。例如,如果有100篇文章,则会成为问题,因此填充单个视图需要101个HTTP请求。

我现在能想到的解决方案是:

1。将评论数据包含在初始文章请求中

{
  {
    "id": 1,
    "name": "Article 1",
    ...
    "comments": {
      {
        "id": 1,
        "text": "some comment"
      },
      {
        "id": 2,
        "text": "some comment"
      },
      ...
    }
  },
}

本案例中的问题是:如何将“评论”解析为单独的评论集合,而不是将其包含在文章模型中?

2。在文章响应中包含一些元数据,如下所示:

{
  {
    "id": 1,
    "name": "Article 1",
    ...
    "comments": 13
  },
}

提出问题的选项:我应该如何处理模型的解析,以便一方面可以获得元信息,另一方面,“comments”属性不是一个Backbone会尝试执行更新上?

我觉得可能有其他解决方案,符合REST理念,因此我很遗憾,所以如果您有任何其他建议请告诉我。

2 个答案:

答案 0 :(得分:0)

我认为您最好的选择是使用您的第二个选项,包括文章模型中每篇文章的评论数量。

  

提出问题的选项:我应该如何处理模型的解析,以便一方面可以获得元信息,另一方面,“comments”属性不是一个Backbone会尝试执行更新上?

不确定您的顾虑是什么。为什么你会担心评论属性会更新?

我想不出任何其他“RESTy”方式来实现你想要的结果。

答案 1 :(得分:0)

我建议使用备选方案2并让服务器返回 一个被视为有用的文章属性的子集 处理文章集合资源时的应用程序 (也许可以/articles)到达。

完整的文章成员资源及其所有评论(是否 它们存储在后端的单独表中 可在/articles/:id)获得。

从Backbone.js的角度来看,你可能想要把它 例如,ArticleCollection中的收集资源 转换每个成员(当前具有属性的子集) 到Article模型。

当用户选择完整地查看文章时,请将其拉​​出 从ArticleCollection出来并调用fetch来填充 它完整​​。

关于如何处理包含的额外/虚拟属性 在集合资源(/articles)中,如评论计数和 可能还有其他用途的聚合,我看到了一些选择:

  1. Article#initialize中,您可以将其从attributes中删除 并将它们存储为文章中的元数据。这种方式内置 Backbone.Model#toJSON将无法看到它们。
  2. 将它们保存在每个模型的attributes部分并覆盖 “序列化”Backbone.Model#toJSON时,Article会驱逐他们。
  3. 在atlernative 1中,Article#commentCount()帮助者可以返回 this._commentCount || this.get('comments').length让它发挥作用 部分和满载的文章。

    对于满载的Article,你可能想转换它 无论如何,嵌套comments数组成为一个完整的CommentCollection 并将其存储在this._comments中,所以我不认为这是不寻常的 让模型直接在模型实例上存储其他内容, 在attributes哈希之外。