在模型挂钩之后设置控制器属性

时间:2015-09-13 20:09:17

标签: ember.js ember-data ember-cli

我需要在model挂钩后设置一个控制器属性。我可以想到两种方法:

model(params) {
  return this.store.findRecord('user', 1);
},

afterModel(model, transition) {
  model.get('profile').then(profile => {
    this.set('profile', profile);
  });
},

setupController(controller, model) {
  controller.set('model', model);
  controller.set('profile', this.get('profile'));
},

另一种方法。即跳过setupController

model(params) {
  return this.store.findRecord('user', 1);
},

afterModel(model, transition) {
  model.get('profile').then(profile => {
    this.controller.set('profile', profile);
  });
},

两者似乎都有效。

这两种方法都有任何额外的优点/缺点吗?显然,后者更短。但是在afterModel钩子中设置控制器属性感觉“干净”吗?

编辑userprofile之间的关系/关联为async

2 个答案:

答案 0 :(得分:5)

正如另一张海报指出的那样,您可以访问model.profile,但如果profile是异步关联,则无法使用代码:

// models/user.js
profile: belongsTo('profile', { async: true })

原因是model.profile将返回一个promise而不是一个值。要解决这个问题,您可以按照建议使用afterModel挂钩,但您只需要

afterModel(model, transition) {
  return model.get('profile');
},

这将发出异步调用并暂停转换,直到完成为止,此时profile可能像往常一样被model.profile访问。如果出于某种原因,您确实希望将配置文件作为控制器属性进行访问,以避免在model.前面添加前缀,只需在控制器中定义别名即可:

profile: Ember.computed.alias('model.profile')  

如果有多个此类属性,则以下内容应该完成此任务:

return Ember.RSVP.Promise.hash(this.getProperties('profile', ...));

您也可以在model挂钩中实现此权限,尽管它的可读性稍差:

model() {
  return this.store.findRecord('user', 1) .
    then(user => user.get('profile') . 
      then(() => user)
    );
}

这就是说,找到用户,然后当找到他的个人资料(这会导致异步请求被激活),然后当找到该用户时,将该用户从promise中返回,因此将其正确设置为{{ 1。}}

答案 1 :(得分:1)

您不需要任何这些代码,因为控制器可以通过this.model访问模型。在任何控制器的方法中,您只需拨打this.get('model.profile')即可。在模板中,您可以使用{{model.profile}}