使用Ember 1.13.6和Ember Data 1.13.7,我想知道如何在不调用服务器(关系为异步)的情况下从商店获取已加载的对象。
图片以下型号:
//page model
export default DS.Model.extend({
parent: DS.belongsTo('page', { async: false, inverse: 'subpages'}),
subpages: DS.hasMany('page',{ async: true, inverse: 'parent' }),
});
如果您只是致电model.get('subpages')
,则Ember Data会返回承诺+拨打服务器。通常这是很好的行为,但现在我有一个特殊情况,我只想抓住已经加载的对象。
我无法在文档中找到有关此类案例的任何内容。我目前找到的唯一方法是使用私有属性:
model._internalModel._relationships.initializedRelationships.subpages.canonicalState
当然,我寻求一种正常的方法来实现这一目标,而不会触及Ember Data的内部代码。那么有谁知道如何实现这个目标呢?
答案 0 :(得分:1)
我认为你不能直接从关系中做到这一点,但你可以偷看。
this.store.peekAll('page')
不会打电话给后端。你可以使用一个过滤器,他们不会碰到后端:
existingSubpages: function(){
return this.store.filter('page', item => {
return item.parent === this;
});
}.property('subpages.@each')
答案 1 :(得分:0)
除了@Kit Sunde的答案之外,可能还有一种情况是你希望某些对象具有异步关系而其他对象具有同步关系。
使用ready hook可以轻松实现:
ready() {
if(this.get('relationIsSynced')) { //whater case you got
this.set('subpages.content.relationship.isAsync', false);
}
}