首页 > 解决方案 > 为什么“hasMany”关系会为关系中的每个项目创建一个 OPTIONS 和 GET 请求?

问题描述

我目前从我的 API 得到这样的响应:

{
  "data": [{
      "attributes": {
        "customer_name": "The Name",
      },
      "id": 1,
      "relationships": {
        "tasks": {
          "data": [{
              "attributes": {
                "name": "The task",
              },

            ]
          }
        },
        "type": "customer"
      }
    ]
  }

Ember 会正确加载模型。但是,当我尝试使用关系创建的计算属性时,Ember 会为关系中的每个项目启动一个OPTIONS后续GET请求。

我以前没有处理过这类关系,所以这可能是预期的行为,但我有点困惑。

如果它要为每一个都做一个请求,为什么还要通过关系将这些项目作为原始模型的一部分发送呢?为什么不直接进行可能会快得多的普通模型检索。

这似乎真的很浪费,所以我怀疑我没有正确处理或理解某些东西,我会很感激任何见解。

标签: ember.jsember-data

解决方案


这是您正在做的事情(访问hasMany关系)的预期行为。在您的示例中,Ember Data 的存储中不存在这些任务,因此当尝试访问它们时,Ember Data 足够聪明,可以从您的 API 中为您获取它们。这样做时,它会发出 OPTIONS 和 GET 请求来检索它们。OPTIONS 请求只是一个预检请求

如果您想在不发出如此多网络请求的情况下使用此特定模型及其任务(或其他关系模型),您可以通过假设您正在使用允许它的适配器(即支持JSON API 规范),您的 API 也可以:hasManyinclude

// for example, fetching a post with its comments (hasMany relationship)
this.store.findRecord('post', params.post_id, { include: 'comments' } );

这样做应该在一个网络请求中返回模型及其任务。如需进一步阅读,我会查看 Ember 的关系指南。


推荐阅读