我重写了反序列化方法,所以我可以从后端加载一个与id对应的对象。但是,我获取此对象的方式是异步的。反序列化不会等待我的回调并自动返回。
示例:
show: Em.Route.extend({
route: "/:id",
deserialize: function(router, post) {
var postController = router.get('postController ');
postController.findById(post.id, function(post) {
return post
});
}
调用后端,但反序列化会自动返回。有没有办法在反序列化中使用异步调用?
谢谢
答案 0 :(得分:3)
卢克·梅利亚(Luke Melia)通过jQuery Deferred对象使用Promises在这件事上做了纽约Ember聚会闪电演讲。基本上,Ember会检测您是否返回Promise(通过查看对象是否具有then
方法),并将路由置于loading
状态(您必须将其声明为状态的兄弟)反序列化)。在ajax.done
上,您可以解析承诺,使路由器完全处于数据完全加载的状态。
使用新的路由器,你真的不应该使用对vanilla statemanager中存在的异步转换的支持,但你可以使用自动加载状态来实现同样的事情。
答案 1 :(得分:0)
以下是我发现的内容,这适用于旧版本的ember:
在州/路线的输入功能中,您可以尝试加载数据。 enter函数作为第二个参数接收转换对象,它有2个方法。一个是'异步',告诉过渡它不能继续,直到另一个方法'resume'有bean调用。
所以在示例中:
...
enter: function (r, t) {
t.async();
r.get('postController').loadResources(t.resume);
},
...
答案 2 :(得分:0)
对于较新版本的Ember,您应该为您加载的数据使用某种代理。
{
PostController: Ember.ObjectController.extend({
find: function (id) {
var ajax = Em.$.ajax(); //call the ajax thing
ajax.done(Em.$.proxy(function (data) {
this.set('content', data);
}, this));
return this;
}
})
...
Router: Em.Router.extend({
show: Em.Route.extend({
deserialize: function(router, post) {
var postController = router.get('postController');
postController.find(post.id);
return postController;
}
});
})
}