2016-01-08 32 views
0

我有这个代码在我烬应用:有人可以解释async如何处理belongsTo/hasMany关系吗?

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  : 1.4.0 
Ember Data : 1.0.0-beta.7+canary.b45e23ba 
Handlebars : 1.3.0 

编辑:在relatioships使用REST适配器都

+0

烬什么(数据)-version您使用的?哪个适配器(REST f.e.)?也许shouldReloadAll = false? – Jeff

+0

@Jeff我知道我忘记了一些重要的信息。更新。 –

回答

0

异步

{ async: true}是因为1.13灰烬关系的默认值这意味着在大多数情况下,您可以定义关系而不指定异步值。这意味着相关记录在需要之前不会被加载到商店中。这几乎总是所需的方式,因为它可以通过返回承诺来防止阻塞。请记住,承诺需要不同的编程方式,因为该过程不再是逐步执行代码的程序。您通过链接.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') 
}); 
+0

现在还不知道“{async:true}”是默认的。我已经读了几次Ember显式反向文档,我想我明白了,但也许我仍然错过了一些东西。无论如何,我认为这有助于,谢谢! –