Ember.js路由器和动态段

dav*_*401 2 javascript ember.js ember-old-router

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

但是,我正在使用多个动态细分:

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

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

Mik*_*ski 5

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

  • transitionTo 应该从routes事件处理程序调用,并按如下方式传递上下文:

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

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

{{#each post in controller}}
  <a {{action showPost post}}>Show post {{post.title}}</a>
{{/each}}
Run Code Online (Sandbox Code Playgroud)

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

router.transitionTo('posts.member.comments.show', post, comment);
Run Code Online (Sandbox Code Playgroud)

post&commentcontexts将传递给适当的路由,而路由将下降到嵌套路由.


编辑

没有余烬数据,它看起来像:

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'
      })
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

而你也有两个类App.PostApp.Commentfind类方法和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
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 您是否考虑传递几个ID(分开)而不是连接几个段.您给出的URL表示三个嵌套路由:charts> chart1> chart2.它似乎不符合您的要求... (2认同)