在 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 一个 编译 js 异步 hasMany Ember      更新时间:2023-09-26

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

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

现在,这按照我期望的方式工作,懒惰地加载数据并且不加载帖子,除非.js或模板中需要它。所以当我这样做时

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

我让每个帖子毫无问题地呈现其标题。但是,在我的服务器日志中,我看到以下内容:

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

其中数字是帖子 ID。这是意料之中的,因为当我从服务器返回用户实例时,我返回一个 id 列表作为参数 'posts'。因此,用户实例具有:

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

在其数据中。

现在我的问题是:当我使用 ember-data 1.0(pre ember-cli 和 pre ember 1.13)时,我记得对数据库的调用是为了同一个用例:

GET /posts?ids=2&7&13

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

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

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

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

我认为,这个SQL调用被解释为余烬端的manyArray,并且很容易像你期望的Ember Array那样运行。

我怎样才能让这种情况再次发生?我很有信心我错过了一些东西,我不必"破解"余烬数据;我非常想将这些调用压缩为一个,而不是为每个"帖子"单独调用数据库。

我还应该提到,我不想为这些调用制作{async:false}。

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

您可以在此处查看更多详细信息,但基本上您需要做的就是将以下内容添加到您的应用程序适配器(为所有类型的所有请求启用它)或您的帖子适配器(以便它仅影响发布请求)

如果您

为文件使用 pod 结构,这里有一个例子(我推荐)

// app/application/adapter.js
import DS from 'ember-data';
export default DS.JSONAPIAdapter.extend({
  coalesceFindRequests: true
})