我的ember应用程序中有这个代码:
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适配器
答案 0 :(得分:0)
关系中的异步
{ async: true}
是自1.13以来Ember关系的默认值,这意味着在大多数情况下,您可以定义关系而不指定异步值。这意味着在需要之前,相关记录不会加载到商店中。这几乎总是理想的方式,因为它通过返回一个promise来阻止阻塞。请记住,promises需要一种不同的编程方式,因为该过程不再是逐步完成代码的过程。您通过链接.then(function(param){// handle fulfilled promise here});
来管理承诺。
有些情况{ async: false}
可能是有益的。例如,在一对一的关系中,您希望立即加载关系的两面。
为什么您的代码不起作用
我不确定,但似乎代码已经写好了,而且可能是代码中的错误。与上面的异步相同,您也不需要在此处指定反向值。根据Ember文件:
Ember Data将尽力发现哪些关系相互映射。 Explicit Inverses
您的应用程序作为简单的一对多关系应该可以正常使用:
var FooModel = DS.Model.extend({
bars: DS.hasMany( 'bar' )
});
var BarModel = DS.Model.extend({
foo: DS.belongsTo( 'foo' )
});
答案 1 :(得分:0)
我回答了类似的问题What is an “async relationship”? / {async: true}
vs. {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');
export default DS.Model.extend({
comments: DS.hasMany('comment', {
async: false
})
});
与异步关系相反,访问同步关系 将始终返回一个DS.ManyArray实例 包含现有的本地资源。但是访问会出错 当尚未加载任何已知的相关资源时。
post.get('comments').forEach((comment) => {
});
如果您将links
用于同步关系,则必须使用
ref.reload
来获取资源。