在 Ember.js 2.3 中,如何将 hasMany 异步调用编译为 ember 中的一次调用而不是多次调用?

in Ember.js 2.3, how do I compile a hasMany async call into one call in ember instead of several?

我正在升级到 ember-cli 和 ember 2.3。假设我有一个名为 User 的模型和一个名为 Post 的模型,以及一个用户......

posts: DS.hasMany('post', {async:true})

现在,这按照我期望的方式工作,延迟加载数据而不加载 posts,除非在 .js 或模板中需要它。所以当我这样做时

{{#each user.posts as |post|}}
  {{post.title}}
{{/each}}

我让每个 post 都能毫无问题地呈现其标题。但是,在我的服务器日志中,我看到了这个:

GET /posts/2
GET /posts/7
GET /posts/13

其中数字是 post ID。这是意料之中的,因为当我 return 来自服务器的用户实例时,我 return 一个 ID 列表作为参数 'posts'。所以用户实例有:

...
'posts': '2,7,13'
...

在其数据中。

现在我的问题是:回到过去,当我使用 ember-data 1.0(pre ember-cli 和 pre ember 1.13)时,我 remember 这个调用正在为相同的用例创建数据库:

GET /posts?ids=2&7&13

或类似的东西。我不能 remember 确切的格式,但是,我可以使用这行代码访问服务器端的 ids 列表:

var ids = req.query.ids.toString();

这给了我一个逗号分隔的 ID 列表(字符串格式)。然后我会将其转换为 sql 语句

SELECT * from posts where id in (2,7,13)

这个 SQL 调用被解释为一个 manyArray,我认为,在 Ember 方面,并且很容易表现得像你期望的 Ember 数组那样。

我怎样才能让这种情况再次发生?我非常有信心我错过了一些东西而且我不必 'hack' ember-data;我非常想将这些调用压缩成一个,而不是为每个 'post' 单独调用数据库。

我还应该提到,我不希望为这些调用创建 {async:false}。

我认为您正在寻找的东西是 coalesceFindRequests,这是您适配器上的一项设置,告诉 Ember 将在同一运行循环中发生的多个请求打包成一个 GET 请求,就像您一样过去有过。

您可以看到更多详细信息 here 但基本上您需要做的就是将以下内容添加到您的 ApplicationAdapter(为所有类型的所有请求启用它)或您的 posts适配器(因此它只影响 post 请求)

这里是一个例子,如果你正在为你的文件使用 pod 结构(我推荐)

// app/application/adapter.js
import DS from 'ember-data';

export default DS.JSONAPIAdapter.extend({
  coalesceFindRequests: true
})