我的会员应用程序中有以下代码:
var FooModel = DS.Model.extend({
bars: DS.hasMany( 'bar', { async: true, inverse: 'foo'} )
});
var BarModel = DS.Model.extend({
foo: DS.belongsTo( 'foo', { async: true, inverse: 'bars'} )
});
编辑:使用
Ember : 1.13.7
Ember Data : 1.13.8
但是当我去渲染foo.bars
时,除非我使用浏览器的后退和前进按钮,否则它们不会被加载。重新加载页面会导致foo.bars
再次消失。
当我把代码改成这个:
var FooModel = DS.Model.extend({
bars: DS.hasMany( 'bar', { async: true } )
});
var BarModel = DS.Model.extend({
});
一切都正常,我只是很困惑为什么。特别是因为我从另一个ember应用程序中获得了原始代码,在那里它运行得很好(尽管可能有一些适配器/序列化程序的魔力,我不知道)编辑:它工作的应用程序正在使用
Ember : 1.4.0
Ember Data : 1.0.0-beta.7+canary.b45e23ba
Handlebars : 1.3.0
编辑:对两个都使用REST适配器
relatoships 中的异步
{ async: true}
是自1.13以来Ember中关系的默认值,这意味着在大多数情况下,您定义关系时根本不指定异步值。这意味着相关记录在需要之前不会加载到存储中。这几乎总是想要的方式,因为它通过返回承诺来防止阻塞。请记住,promise需要不同的编程方式,因为该过程不再是通过代码一步一步进行的过程。您可以通过链接.then(function(param){// handle fulfilled promise here});
来管理承诺。
在某些情况下{ async: false}
可能是有益的。例如,在一对一关系中,您希望立即加载关系的双方。
为什么你的代码不工作
我不确定,但似乎你写的代码可能是代码中的一个bug。与上面的async相同,您实际上也不需要在这里指定反值。根据Ember文件:
Ember Data将尽最大努力发现哪些关系相互映射。显式逆
您的应用程序作为一个简单的一对多关系应该可以简单地使用:
var FooModel = DS.Model.extend({
bars: DS.hasMany( 'bar' )
});
var BarModel = DS.Model.extend({
foo: DS.belongsTo( 'foo' )
});
我回答了一个类似的问题什么是"异步关系"?/{async: true}
与{async: false}
异步关系(默认)
接触这种关系会得到承诺。
post.get('comments').then((comments) => {
// now we can work with the comments
});
如果数据不可用,并且关系被访问(例如,从模板或"消耗"的计算属性),Ember data将自动获取资源。
阅读更多关于承诺关系
同步关系(来自文档)
Ember Data解决与相关资源的同步关系在其本地商店中可用,因此期望这些资源以便在主资源之前或沿着主资源加载。
归属
export default DS.Model.extend({
post: DS.belongsTo('post', {
async: false
})
});
与异步关系相反,访问同步关系将始终返回现有本地资源或null。但当已知存在相关资源,但尚未加载该资源。
let post = comment.get('post');
HasMany
export default DS.Model.extend({
comments: DS.hasMany('comment', {
async: false
})
});
与异步关系相反,访问同步关系将始终返回一个DS.ManyArray实例包含现有的本地资源。但访问时会出错当尚未加载任何已知的相关资源时。
post.get('comments').forEach((comment) => {
});
如果使用具有同步关系的links
,则必须使用CCD_ 9来获取资源。