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
关于根据长度实现计算属性的任何其他建议
从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发布博客文章
您提到,每条评论都是单独获取的。如果您的后端支持的话,可以通过在 RestAdapter 上设置coalesceFindRequests来避免这种情况。
然而,您的一个请求仍然过多。我认为,如果没有某种肮脏的伎俩,就可以避免这种情况,但我愿意从其他答案中学习。