我遇到一种情况,我有一条路由扩展了另一条路由,但会向这条新路由添加更多数据。棘手的是,我们希望将新数据与现有基本路由合并。
我可以在模型钩子中同步执行此操作
return Ember.merge(this._super(...arguments), {
foo : 123
});
但是我怎样才能异步检索数据并仍然使用此Ember.merge
,即类似
model(){
return Ember.merge(this._super(...arguments), {
foo : 123
baa: store.get('smthElse')
});
}
将给我一个模型,其中 baa
作为承诺对象,而不是其解析值。
我尝试在store.get('smthElse).then
内返回Ember.merge
,但this._super(...arguments)
抛出了未定义的错误。
model
钩子返回一个承诺,因此您必须等待它解析为值才能合并。
如果要合并的对象也返回了承诺,则还必须等待该承诺。
如果这两个承诺可以并行创建,那么这样的事情应该可以工作:
model(){
return Ember.RSVP.all([
this._super(...arguments), // call parent route's model hook
store.get('smthElse') // call whatever else you need
])
.then( // wait for all promises to resolve before merging
([parentModel, somethingElse]) => (
Ember.merge(parentModel, {
foo : 123,
baa: somethingElse
});
)
);
}
否则,如果请求store.get('smthElse')
依赖于父路由的模型,则应改为链接调用:
model(){
return this._super(...arguments) // call parent route's model hook
.then(
// request something else with the resolved parent model in scope
(parentModel) => store.get('smthElse', parentModel.get('whtvr')).then(
// resolve with both the parent model and something else
(somethingElse) => ({
parentModel,
somethingElse
})
)
)
.then(
({ parentModel, somethingElse }) => (
Ember.merge(parentModel, {
foo : 123,
baa: somethingElse
});
)
);
}