为什么“ hasMany”关系为关系中的每个项目创建一个OPTIONS和GET请求?

时间:2019-06-26 21:31:23

标签: ember.js ember-data

我目前的API响应如下:

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

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

Ember正确加载了模型。但是,当我尝试使用关系创建的计算属性时,Ember对关系中的每个项目都发起OPTIONS和随后的GET请求。

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

如果要为每个请求发送一个请求,为什么不介意通过某种关系将这些项作为原始模型的一部分发送呢?为什么不做一个普通的模型检索,它可能会更快。

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

1 个答案:

答案 0 :(得分:3)

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

如果您想使用此特定模型 及其任务(或其他hasMany关系模型)而又不需要发出太多网络请求,则可以通过同时请求两者来获取两者include假定您正在使用允许它的适配器(即,支持JSON API spec),而您的API也是如此:

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

这样做应该在一个网络请求中返回模型及其任务。为了进一步阅读,我将在Relationships上查看Ember的指南。