2012-06-28 25 views
2

我重写了反序列化方法,因此我可以从后端加载对应于该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

以下是我已经找到了,这将工作在旧版本的余烬:

在国家/路线,你可以尝试加载数据的输入功能。输入函数在具有2个方法的转换对象处接收作为第二个参数。一个是“异步”,它告诉转换,它不能继续,直到另一个方法'resume'被bean调用。

所以在例如:

... 
    enter: function (r, t) { 
      t.async(); 
      r.get('postController').loadResources(t.resume); 
    }, 
    ... 
+0

但是这种接缝不适用于较新版本的烬? – Neppord

0

为灰烬的新版本,你应该使用一些类型的代理为您加载数据。

{ 
     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; 
       } 
      }); 
     }) 
    } 
+0

虽然返回代理将起作用,但稍后可能会导致问题。代理不会转发方法调用,因此您可能需要在稍后调用方法之前检测对象是否为代理。 – Garth

+0

@Garth在这种情况下,它的数据来自ajax调用,所以我不认为它有方法。 – Neppord

+0

显示的示例只是非常基本的。在大多数情况下,当接收到ajax回调时,您会希望将'data'转换为一个ember模型对象。 – Garth

3

Luke Melia在这件事上做了NYC Ember meetup闪电谈话,使用Promise通过jQuery Deferred对象。基本上,Ember会检测您是否返回Promise(通过查看对象是否具有then方法),并将该路线置于loading状态(您必须声明为具有反序列化状态的兄弟)。在ajax.done上,您可以解决承诺,使路由器完全处于满载数据的状态。

使用新的路由器,你并不真的应该使用对vanilla statemanager中存在的异步转换的支持,但是你可以使用自动加载状态来实现同样的功能。

相关问题