Ember JS:如何基于第一个数据加载第二个模型

Jam*_*esG 3 ajax promise ember.js rsvp.js

我有一个Ember应用程序,而不是使用Ember Data,使用我们自己的自定义AJAX数据层来与API通信.

我们可以使用RSVP一次加载两个模型 - 一个是Project通过我们的API包装器的对象,第二个是表示登录用户的对象.两者都传递到控制器和模板,工作得很好.

但我需要根据返回Project对象中的值加载第二个模型.

一旦我在我的路线中装载了这样的模型......

App.ProjectUpdateRoute = Ember.Route.extend({

    setupController: function(controller, model) {
        controller.set('model', model);
    },

    model: function(params) {

        return Ember.RSVP.hash({
            // Load Project from API - /myapi/v1/Project/:ProjectID
            Project : App.Project.create().findById(params.ProjectID),
            // Load current user from local object
            User : App.AuthUser,
        });
    },
});
Run Code Online (Sandbox Code Playgroud)

...我有一个Project(或更确切地说model.Project)具有各种属性的对象,包括拥有该项目的用户的ID.

现在,我想进行第二次API调用/myapi/v1/User/:UserID以获取用户的详细信息.

我尝试过的所有内容 - 包括App.User.create().findById(UserID)在路由setupController函数和控制器中添加更多调用- 都会产生正确的API调用,但它是异步的,因此Ember继续渲染页面而我无法显示API调用的结果页.

那么 - 如何以及在Ember结构中的哪个位置,我会根据第一个数据加载第二个模型?我如何让ember等待第二次AJAX调用的解决承诺?

UPDATE

我也尝试过使用afterModel:function()几乎我需要的东西 - 它在应用程序流程中的第二个API调用正确的位置,但我仍然需要将结果添加到我现有的model数组中:

afterModel: function(model, tranistion, params) {

    // Returns the promise but doesn't update 'model'
    return Ember.RSVP.hash({
        ProjectOwner : App.User.create().findById(model.Project.UserID)
    });
}
Run Code Online (Sandbox Code Playgroud)

Kin*_*n2k 6

链接承诺,Ember将采取最终结果(从模型钩子)

model: function(params) {

  return Ember.RSVP.hash({
      // Load Project from API - /myapi/v1/Project/:ProjectID
      Project : App.Project.create().findById(params.ProjectID),
      // Load current user from local object
      User : App.AuthUser,
    }).then(function(results){
      return App.User.create().findById(results.Project.UserID).then(function(user){
        results.projectUser = user;
        return results;
      });
    });
},
Run Code Online (Sandbox Code Playgroud)