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
            });
        }

调用了后端,但反序列化会自动返回。有没有办法在反序列化中使用异步调用?

谢谢

4

3 回答 3

3

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

使用新路由器,您实际上不应该使用 vanilla statemanager 中存在的对异步转换的支持,但您可以使用自动加载状态来实现同样的事情。

于 2012-10-02T19:56:04.293 回答
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;
              }
          });
      })
    }
于 2012-07-11T11:57:27.527 回答
0

这是我发现的,这适用于旧版本的 ember:

在状态/路线的输入功能中,您可以尝试加载数据。enter 函数接收作为转换对象的第二个参数,它有 2 个方法。一个是'async',它告诉转换它不能继续,直到另一个方法'resume'调用了bean。

所以在示例中:

    ...
    enter: function (r, t) {
           t.async();
           r.get('postController').loadResources(t.resume);
    },
    ...
于 2012-07-10T12:13:11.410 回答