2015-08-31 156 views
0

我们有一个模型,其中有一些belongsTo和hasMany关系设置为async:true。该API只传递ID。只要页面加载Ember请求所有这些ID。EmberJs异步立即触发

这是预期的行为?我感觉这个数据在被调用时会被加载。

我该如何去了解为什么这些电话正在发生?

我们使用灰烬1.13.9和灰烬数据11年1月13日

编辑:原来我们有一些扩大我们的模型,被击中所有这些异步关系。

+0

@ torazaburo的答案是相当深入,但如果你觉得不够,你将不得不放弃更多的细节关于您的应用,例如您在使用关系的模板中的方式。 – locks

回答

2

我在这个印象之下,这个数据在被调用时会被加载。

你是什么意思的“叫”?

说“加载需要”会更准确。

考虑以下几点:

// parent-model 
children: hasMany('children', { async: true }) 

// parent-controller 
displayChildren: false 

// child-model 
name: attr() 

// template 
{{#if displayChildren}} 
    {{#each model.children as |child|}} 
    {{child.name}} 
    {{/each}} 
{{/if}} 

由于displayChildren是假的,在模板中的循环将不被执行。因此,孩子们不需要。因此他们不会被检索。当displayChildren设置为true时,模板需要孩子,并且将被检索。如果displayChildren的初始值为true,则在渲染时将立即检索这些孩子。

还有另一种情况,异步关系引用的记录将被加载:当他们调用get时(这是当模板试图获取它们时发生的情况)。这get将返回实际价值的承诺。因此,如果由于某种原因,你需要或者希望从程序逻辑访问的孩子,你写的东西是这样的:

// parent-controller 
someFunc() { 
    this.get('model.children') . then(children => /* do something with children */) 
}