返回异步EmberJS路由的Promise字典

时间:2015-09-23 00:03:21

标签: javascript asynchronous ember.js handlebars.js

我正在学习如何使用异步路由的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 集合,可以在我的模板中单独访问。

1 个答案:

答案 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检索并等待辅助模型。