Ember结合路线数据

时间:2017-05-22 13:56:21

标签: javascript ember.js

我有一种情况,我有一条路线延伸另一条路线但会向这条新路线添加更多数据。令我们变得棘手的是我们想要将新数据与现有的基本路线合并。

我可以使用

在模型钩子中同步执行此操作
return Ember.merge(this._super(...arguments), {
  foo : 123
});

但是如何异步检索数据并仍使用此Ember.merge,例如

model(){
  return Ember.merge(this._super(...arguments), {
    foo : 123
    baa: store.get('smthElse')
  });
}

会给我一个模型,baa作为一个承诺对象,而不是它的已解析值。

我尝试在Ember.merge内部返回store.get('smthElse).then,但this._super(...arguments)提出了未定义的错误。

1 个答案:

答案 0 :(得分:0)

model挂钩返回一个promise,因此您必须等待它在合并之前使用值解析。

如果您要合并的对象也返回一个承诺,您也必须等待该承诺。

如果两个promises可以并行创建,那么这样的东西应该有效:

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