1

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

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 调用在 Ember 端被解释为 manyArray,并且很容易像您期望的 Ember 数组那样表现。

我怎样才能让这种情况再次发生?我非常有信心我遗漏了一些东西,并且我不必“破解” ember-data;我非常想将这些调用压缩为一个,而不是为每个“帖子”单独调用数据库。

我还应该提到,我不打算为这些调用进行 {async:false}。

4

1 回答 1

0

我认为您正在寻找的是coalesceFindRequests,这是您的适配器上的一个设置,用于告诉 Ember 将在同一个 runloop 中发生的多个请求捆绑到一个 GET 请求中,就像您过去所做的那样。

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

这是一个示例,如果您对文件使用 pod 结构(我推荐)

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

export default DS.JSONAPIAdapter.extend({
  coalesceFindRequests: true
})
于 2016-03-09T17:22:52.213 回答