Ember.js在控制器内部处理异步关系

时间:2015-06-29 13:22:14

标签: ember.js ember-data

我有2个型号:

App.Center = DS.Model.extend({
    name: DS.attr('string'),
    code: DS.attr('string'),
    studies: DS.hasMany('study', {async: true})
});

App.Study = DS.Model.extend({
    center: DS.belongsTo('center'),
    //other data
});

理论上,Ember将等待研究承诺得到解决,然后渲染模板以显示它们。对于常见情况,这非常好。

我必须对CenterStudiesController内的中心研究实施一些过滤和其他操作。

问题是center.get('studies')是控制器内的空数组。我怎么能等他们被装上?

我不想修改服务器代码以便加载研究。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

Promise可以在路由中解析(在model,beforeModel或afterModel钩子中)。如果模型钩子(或相关的beforeModel或afterModel钩子)返回一个promise(或者如果一个promise作为transitionTo的参数提供),过渡将暂停,直到该承诺履行或拒绝。

传递给每个路由的setupController挂钩的值将是promises中已实现的值。 http://guides.emberjs.com/v1.12.0/routing/asynchronous-routing/#toc_the-router-pauses-for-promises

您可以在路线中解析center.studies作为模型。在CenterStudies中,控制器model将被解析为studies的数组。

//center studies route
model: function() {
   var center = this.modelFor('center'); // or something else it depends on your logic
   return center.get('studies');
}

// center studies controller
filteredStudies: Ember.computed('model.[]', function() {
  // your filtering here
})

// center studies template
{{#each filteredStudies as |study|}}
   {{study.data}} 
{{/each}}