Ember减少了对hasMany和belongsTo查找的请求

Mar*_*tin 4 handlebars.js ember.js ember-data

我有以下三种型号:

ConversationApp.Post = DS.Model.extend(
  body: DS.attr()
  replies: DS.hasMany('reply', async: true)
  author: DS.belongsTo('user', async: true)
  likedBy: DS.hasMany('user', async: true)
)

ConversationApp.Reply = DS.Model.extend(
  body: DS.attr()
  post: DS.belongsTo('post')
  author: DS.belongsTo('user', async: true)
  likedBy: DS.hasMany('user', async: true)
)

ConversationApp.User = DS.Model.extend(
  firstName: DS.attr()
  lastName: DS.attr()
)
Run Code Online (Sandbox Code Playgroud)

我的索引路由进行此调用:

ConversationApp.IndexRoute = Em.Route.extend(
  model: (args) ->
    @store.find('post', page: 1) # => /api/v1/posts?page=1
)
Run Code Online (Sandbox Code Playgroud)

在进行该呼叫之后,Ember开始获取第一页所需的所有用户 - 在第一页上共有17个(!)不同的用户请求(具有10个帖子).以下是Ember向服务器发出的3个请求示例:

  • / API/V1 /用户/ 11375
  • / API/V1 /用户/ 4383
  • / API/V1 /用户?IDS [] = 34588&IDS [] = 7442&IDS [] = 10294

我希望Ember只提出一个请求,请求第一页所需的所有用户:

  • / API/V1 /用户?IDS [] = 34588&IDS [] = 7442&IDS [] = 10294&IDS [] = 11375&IDS [] = 4383

把手文件如下所示:

{{#each}}
  {{author.firstName}}
  {{#each likedBy}}
    [... removed for brevity ...]
  {{/each}}

  {{#each replies}}
    {{author.firstName}}
    {{#each likedBy}}
      [... removed for brevity ...]
    {{/each}}
  {{/each}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

Mir*_*kov 9

我知道这是一个旧线程,但这是一个使用的解决方案DS.RESTAdapter.

实现这一目标非常容易.你必须做的唯一的事情被设置coalesceFindRequeststrue,就像这样:

App.ApplicationAdapter = DS.RESTAdapter.extend({
    coalesceFindRequests: true
});
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是Ember CLI

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

export default DS.RESTAdapter.extend({
    coalesceFindRequests: true
});
Run Code Online (Sandbox Code Playgroud)

您可以在DS.RESTAdapter api文档中阅读有关它的更多信息

祝好运!:)