我正在学习如何使用异步路由的Ember承诺,并在这里磕磕绊绊。如果我这样写我的路线:
App.ActivitiesRoute = Ember.Route.extend({
model: function() {
return getClient().getActivities()
}
});
getActivities()
返回Ember.RSVP.Promise
类型的地方,我可以在我的模板中使用:
{{#each activity in model}}
但是,我宁愿不让我的整个基本模型存在单个属性。当我尝试这个时:
App.ActivitiesRoute = Ember.Route.extend({
model: function() {
return {
activities: getClient().getActivities()
}
}
});
将我的模板更改为:
{{#each activity in model.activities}}
我收到一条错误消息:
"Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed {_id: 82, _label: undefined, _state: undefined, _result: undefined, _subscribers: }"
我不知道如何返回一个命名的Promises 集合,可以在我的模板中单独访问。
答案 0 :(得分:1)
model
需要返回一个promise,以便基于promise的转换机制能够工作。你没有回复承诺;你正在返回一个承诺的哈希,这是完全不同的事情。您可以返回哈希值承诺,该承诺在其所有个人密钥都符合Ember.RSVP.Promise.hash
:
model() {
return Ember.RSVP.Promise.hash({
activities: getClient().getActivities()
});
}
此承诺将解析为类似{ activities: activities }
的哈希。请记住,在其他条件相同的情况下,这将被设置为控制器的model
属性。因此,在控制器和模板中,您现在需要参考model.activities
。
如果要等待多个异步调用(例如对this.store
的多次调用)在转换继续之前完成,则可以在模型钩子中使用相同的哈希方法:
model() {
return Ember.RSVP.Promise.hash({
activities: getClient().getActivities(),
toys: this.store.findQuery('toy', type })
});
}
然后在model
中将“main”设置为控制器上的setupController
:
setupController(controller, model) {
controller.set('model', model.activities);
}
在某些情况下,更简单的方法是在model
钩子中检索主模型,并使用afterModel
检索并等待辅助模型。