获取hasMany关系的长度而不触发获取

Joe*_*e B 5 ember.js ember-data

模型:

DS.Model.extend({
  title: DS.attr('string'),
  body: DS.attr('string'),
  comments: DS.hasMany('comment', { async: true} ),

  hasComments: Ember.computed.gt('comments.length', 0)
});
Run Code Online (Sandbox Code Playgroud)

有效载荷:

{ 
  "id": "abcdefg",
  "title": "some cats are cool",
  "body": "",
  "comments: ["100", "101", "102"]
}
Run Code Online (Sandbox Code Playgroud)

但是hasComments计算属性会单独触发每个注释的提取.我不希望这样:D

我知道这有效(避免了获取),但进入私有API:

hasComments: Ember.computed.gt('data.comments.length', 0)

ember.js 1.8.1

ember-data 1.0.0-beta.11

关于根据长度实现计算属性的任何其他建议

Cra*_*den 6

从Ember Data 2.5(在发行说明中提到)开始,有一个函数ds-references可以提供一种方法来检查hasMany关系是否包含项目而不触发对这些项目的获取:

export default Model.extend({
  title: DS.attr('string'),
  body: DS.attr('string'),
  comments: DS.hasMany('comment', { async: true} ),

  hasComments: Ember.computed('comments', function() {
    return this.hasMany('comments').ids().length > 0;
  })
});
Run Code Online (Sandbox Code Playgroud)

看到这个在Ember Twiddle工作

ds-references特性实现了RFC 57中描述的引用API.引用是一个低级API,用于对记录,多个关系和属于关系执行元操作:

  • 同步获取当前本地数据而不触发获取或生成承诺
  • 通知商店已经开始获取给定记录,并为其结果提供承诺
  • 类似地,通知记录已经开始给定关系的获取,并为其结果提供承诺
  • 检索服务器提供的有关记录或关系的元数据

资料来源:Ember论坛帖子Ember Data 2.5发布博客文章


jnf*_*rle 0

您提到,每条评论都是单独获取的。如果您的后端支持的话,可以通过在 RestAdapter 上设置coalesceFindRequests来避免这种情况。

然而,您的一个请求仍然过多。我认为,如果没有某种肮脏的伎俩,就可以避免这种情况,但我愿意从其他答案中学习。