当我以为我终于掌握了承诺如何在Ember工作的概念。这种情况让我重新陷入混乱之中。
用户模型具有以下关联:
model: function(params) {
return this.store.findRecord('user', 1);
}
该路线有:
{{model.profile.firstName}}
{{foo-bar saveProfile=(action "save") profile=model.profile}}
在模板中,我正在渲染一个组件:
{{model.profile.firstName}}
<button {{action "saveProfile" profile}}>Save</button>
渲染得很好。
组件模板具有:
actions: {
saveProfile(profile) {
console.log(profile);
}
}
组件对象具有:
console.log
单击组件模板中的按钮时。 Class {isFulfilled: true, __nextSuper: undefined, __ember_meta__: Object, __ember1442167214792: "ember688"}
呈现:
model.profile
模板已解析profile
,并且已将已解析的值传递给模板。为什么{{1}}(在组件中)返回一个promise?
答案 0 :(得分:1)
由于您没有包含user
类定义,我会稍微猜一下。您的配置文件属性是异步关系,异步关系使用代理承诺。
代理承诺允许您在代理承诺上使用getter,它会解析该属性,就像它在代理本身上存在一样。这意味着您的模板没有已解决的profile
,但正在调用model.get('profile.firstName')
并获取已解析的值(即使稍后履行了个人资料)。
model.profile
是代理承诺,当承诺已经履行时,您可以在其上使用getter并期望显示基础记录的值。
由于这种关系是异步的,你应该始终认为它还没有完成,等待在尝试使用记录之前履行承诺。
actions: {
saveProfile(profilePromise) {
profilePromise.then(function(profileRecord){
console.log(profileRecord);
});
}
}
actions: {
saveProfile(profileMaybePromise) {
Ember.RSVP.Promise.cast(profileMaybePromise).then(function(profileRecord){
console.log(profileRecord);
});
}
}