给定以下路由器,使用相当直接的路由synatx:
App.Router.map(function () {
this.resource('foos', function(){
this.resource('foo', { path: '/:foo_id' }, function(){
this.route('bar');
});
});
});
我有FoosController
和FooBarController
,每个都有相应的路由:FoosRoute
和FooBarRoute
。
两个路由都有一个model
挂钩,返回一个promise,它是从ic.ajax
获得的。
当我导航到/foos
,然后导航到/foos/123/bar
时,会发生以下顺序:
FoosRoute#model
向GET /api/foos
/api/foos
FooBarRoute#model
向GET /api/foos/123
/api/foos/123
这太好了,我的应用程序运行正常。接下来我直接转向/foos/123/bar
,发生以下序列:
FoosRoute#model
向GET /api/foos
FooBarRoute#model
向GET /api/foos/123
/api/foos/123
/api/foos
model
和FoosRoute
的{{1}}挂钩会连续发射。
服务器从FooBarRoute
返回响应所需的时间比/api/foos
更长,因此它们无法到达。这会使我的应用程序处于不正确的状态,我想通过确保/api/foos/123
的{{1}}挂钩仅在model
挂钩返回{ {1}}已解决。
我该怎么做?
这些JsBins提供了一个简洁的问题演示,分散了由@ kingpin2k组装的演示:
使用FooBarRoute
。两个模型都加载,但子路径在父路径之前加载其模型:
使用model
。两个模型都加载,并且子路径正确地等待父路由加载模型,但UI不会更新:
答案 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;
});
}
});