余烬组合路由数据



我遇到一种情况,我有一条路由扩展了另一条路由,但会向这条新路由添加更多数据。棘手的是,我们希望将新数据与现有基本路由合并。

我可以在模型钩子中同步执行此操作

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
        });
      )
    );
}

最新更新