2

我一直在使用带有单个动态段的 Ember 路由器(v1.0.pre),并且对它非常满意。
这么多魔法

但是,我正在为多个动态细分而苦苦挣扎:

  • 应该serialize()/deserialize()返回什么?
  • transitionTo()那里的电话和上下文应该如何?

有人可以对此有所了解吗?

4

1 回答 1

5
  • serialize并且deserialize只应在您的上下文对象具有自定义序列化(即不是 ember-data 模型实例)时实现。因此,您不必在使用完整的 ember 堆栈时实现这些方法。

  • transitionTo应该从路由事件处理程序中调用,并且上下文传递如下:

showPost: function (router, event) {
  var post = event.context;
  router.transitionTo('posts.show', post);
}

鉴于该showPost事件已由action这样的助手触发:

{{#each post in controller}}
  <a {{action showPost post}}>Show post {{post.title}}</a>
{{/each}}

通过几个上下文对象(对于深度嵌套的路由)可以实现更复杂的转换:

router.transitionTo('posts.member.comments.show', post, comment);

post&comment上下文将传递给适当的路由,而路由将下降到嵌套路由。


编辑

如果没有 ember-data,它看起来像:

posts: Ember.Route.extend({
  route: 'posts',

  member: Ember.Route.extend({
    route: '/:post_id',

    show: Ember.Route.extend({
      route: '/'
    }),

    comments: Ember.Route.extend({
      route: 'comments',

      show: Ember.Route.extend({
        route: '/:comment_id'
      })
    })
  })
})

您将有两个类App.Post& App.Comment,具有find类方法和id实例属性。

App.Post = Ember.Object.extend({
  id: null
});
App.Post.reopenClass({
  find: function (id) {
    // retrieve data, instanciate & return a new Post
  }
});

App.Comment = Ember.Object.extend({
  id: null
});
App.Comment.reopenClass({
  find: function (id) {
    // retrieve data, instanciate & return a new Comment
  }
});
于 2012-08-09T12:49:38.883 回答