只有在父路线返回的承诺在EmberJs中解决后才生成子路由火灾模型钩子?

时间:2014-03-28 00:57:04

标签: javascript ajax ember.js promise ember-router

给定以下路由器,使用相当直接的路由synatx:

App.Router.map(function () {
  this.resource('foos', function(){
    this.resource('foo', { path: '/:foo_id' }, function(){
      this.route('bar');
    });
  });
});

我有FoosControllerFooBarController,每个都有相应的路由:FoosRouteFooBarRoute。 两个路由都有一个model挂钩,返回一个promise,它是从ic.ajax获得的。

当我导航到/foos,然后导航到/foos/123/bar时,会发生以下顺序:

  • FoosRoute#modelGET /api/foos
  • 发出XHR请求
  • /api/foos
  • 返回的回复
  • FooBarRoute#modelGET /api/foos/123
  • 发出XHR请求
  • /api/foos/123
  • 返回的回复

这太好了,我的应用程序运行正常。接下来我直接转向/foos/123/bar,发生以下序列:

  • FoosRoute#modelGET /api/foos
  • 发出XHR请求
  • FooBarRoute#modelGET /api/foos/123
  • 发出XHR请求
  • /api/foos/123
  • 返回的回复
  • /api/foos
  • 返回的回复

modelFoosRoute的{​​{1}}挂钩会连续发射。

服务器从FooBarRoute返回响应所需的时间比/api/foos更长,因此它们无法到达。这会使我的应用程序处于不正确的状态,我想通过确保/api/foos/123的{​​{1}}挂钩仅在model挂钩返回{ {1}}已解决。

我该怎么做?


这些JsBins提供了一个简洁的问题演示,分散了由@ kingpin2k组装的演示:

使用FooBarRoute。两个模型都加载,但子路径在父路径之前加载其模型:

使用model。两个模型都加载,并且子路径正确地等待父路由加载模型,但UI不会更新:

1 个答案:

答案 0 :(得分:1)

您需要使用我们已经讨论过的fetch,并且在您的自定义find重载中,您需要返回记录,而不是record.load未定义的结果。

return App.AppModel.fetch(1);

App.AppModel.adapter = Ember.Adapter.create({
    find: function(record, id) {
        //instead of jQuery.ajax, use ic.ajax as suggested by stefanpenner
        //See: https://github.com/emberjs/ember.js/issues/4442#issuecomment-36207354
        var req = ic.ajax.raw({
            type: 'GET',
            url: App.apiUrl+'/appmodels/'+id,
            contentType: 'application/json',
            dataType: 'json',
            processData: false
        });
        return req.then(function resolve(result) {
          console.log('AppModel adapter find resolve', result.response);

          record.load(id, result.response);
          return record;
        });
    }
});

http://jsbin.com/cukuciva/1/edit