在EmberJs中,只有在父路由返回的承诺被解析后,才让子路由触发模型钩子
Make child Route fire model hook only after the promise returned by parent Route has resolved in EmberJs?
给定以下路由器,使用相当直接的路由语法:
App.Router.map(function () {
this.resource('foos', function(){
this.resource('foo', { path: '/:foo_id' }, function(){
this.route('bar');
});
});
});
我有FoosController
和FooBarController
,每个FoosRoute
和FooBarRoute
都有相应的路由。两个路由都有一个model
钩子,它返回一个从ic.ajax
获得的承诺。
当我导航到/foos
,然后导航到/foos/123/bar
时,发生以下顺序:
-
/api/foos
返回的响应 -
FooBarRoute#model
向GET /api/foos/123
发出XHR请求 -
/api/foos/123
返回的响应
FoosRoute#model
向GET /api/foos
发出XHR请求这是伟大的,我的应用程序工作良好。接下来,我直接导航到/foos/123/bar
,发生以下顺序:
-
FoosRoute#model
向GET /api/foos
发出XHR请求 -
FooBarRoute#model
向GET /api/foos/123
发出XHR请求 -
/api/foos
返回的响应
/api/foos/123
返回的响应 model
的钩子为FoosRoute
和FooBarRoute
快速连续射击。
服务器从/api/foos
返回响应的时间比从/api/foos/123
返回响应的时间长,因此它们是乱序到达的。这使我的应用程序进入一个不正确的状态,我想通过确保FooBarRoute
的model
钩子只有在FoosRoute
的model
钩子返回的承诺解决后才被触发来解决这个问题。
我该怎么做?
这些jsbin提供了问题的简明演示,从@kingpin2k:
的演示中派生出来。使用find
。两个模型都加载,但是子路由在父路由之前加载它的模型:
- http://jsbin.com/topot/3/edit?html, js、控制台、输出
使用fetch
。两个模型都加载了,子路由正确地等待父路由加载模型,但UI没有更新:
- http://jsbin.com/topot/4/edit?html, js、控制台、输出
您需要使用我们已经讨论过的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 相关文章:
- 延迟 AngularJS 路由更改,直到加载模型以防止闪烁
- 如何调用索引/索引路由'用户后的s模型挂钩's的授权
- 如何在ember.js中将多个模型处理成一个模板/路由
- Ember.js:路由返回多个模型,包括一个promise,给出错误
- 使用可选参数和默认模型定义路由
- Ember.js:如何使用模型的单个实例创建路由/控制器
- 如何计算父路由模型的项目以在嵌套路由中使用它
- 余烬转换到路由模型挂钩未调用
- Ember JS - 从路由操作更新/刷新模型数据
- 从父级转换时,不会触发 Ember 子路由模型方法
- 使用 Ember js 从非嵌套路由访问路由模型
- 余烬与数据 - 路由模型无法一致地工作
- 访问Ember.js中的父路由模型
- 承诺在烬路由模型不解析/更新
- 用ember.js重新加载非动态路由模型的正确方法是什么?
- 使用ember试图从路由模型钩子中设置控制器中的值会产生错误
- ember.js中的应用路由模型
- 如何在Ember.js中销毁一个transition上的路由模型
- Ember.js 路由:查询参数上的“刷新模型:true”,而不更新子路由模型
- 在ember.js的控制器中使用另一个路由模型