2

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

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
  },
}

引发问题的选项:我应该如何处理模型的解析,以便一方面元信息可用,另一方面,“评论”属性不是 Backbone 会尝试执行更新的属性?

我觉得可能有另一种解决方案,符合 REST 哲学,我缺少这个,所以如果您有任何其他建议,请告诉我。

4

2 回答 2

0

我认为你最好的选择是选择第二个选项,在你的文章模型中包含每篇文章的评论数量。

引发问题的选项:我应该如何处理模型的解析,以便一方面元信息可用,另一方面,“评论”属性不是 Backbone 会尝试执行更新的属性?

不知道你关心的是什么。为什么你会担心评论属性会被更新?

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

于 2012-09-27T13:03:42.223 回答
0

我建议使用备选方案 2 并让服务器返回文章属性的子集,这些属性在处理文章集合资源时被认为对应用程序有用(可能在 处可访问/articles)。

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

从 Backbone.js 的角度来看,您可能希望将集合资源放在 a 中,例如,ArticleCollection它将每个成员(当前具有属性的子集)转换为Article模型。

当用户选择完整查看一篇文章时,您将其拉出ArticleCollection并调用fetch以完整填充它。

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

  1. Article#initialize您可以从中提取这些内容attributes 并将它们作为元数据存储在文章中。这样内置 Backbone.Model#toJSON将不会看到它们。
  2. 将它们保留在attributes每个模型的部分中,并在“序列化”时覆盖 Backbone.Model#toJSON以排除它们Article

在替代方案 1 中,Article#commentCount()帮助器可以返回 this._commentCount || this.get('comments').length以使其在部分和完全加载的文章上工作。

对于完全加载的Article情况,您可能无论如何都希望将嵌套comments数组转换为完整的数组并将其CommentCollection存储在其中,this._comments因此我认为让您的模型直接在模型实例上存储其他内容并不罕见,在其attributes散列之外.

于 2012-09-27T13:06:24.750 回答