我需要在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
钩子中设置控制器属性感觉“干净”吗?
编辑:user
与profile
之间的关系/关联为async
。
答案 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}}
。