2

我的 ember 路线中有嵌套资源。让我们假设根据这个例子,我router.js看起来像:

App.Router.map(function() {
  this.resource('post', { path: '/post/:post_id' }, function() {
    this.resource('comment', { path ':comment_id' });
  });
});

文档说这应该生成如下路由:

/post/:post_id              post.index
/post/:post_id/:comment_id  comment.index

但是我希望这些是post.showcomment.show,我如何重命名这些路线?

4

1 回答 1

1

我已经使用以下设置来解决这个问题。

具有动态段的路由器:

App.Router.map(function() {
    this.resource('post.show', { path: '/post/:post_id' });
    this.resource('comment.show', { path: '/post/:post_id/:comment_id' });
});

覆盖的serialize钩子App.CommentShowRoute以反映预期的网址:

App.CommentShowRoute = Ember.Route.extend({
    serialize: function(model) {       
        return {           
            post_id : model.get("post_id"),
            comment_id : model.get("id")
        };
    }
});

实现这一点的主要问题是生成的 url,因为serialize钩子中的模型没有加载,post_id属性不存在,并且在模型加载后不会自动更新。因此,linkTo定位评论将有一个 url post/undefined/1,而不是post/1/1. 单击链接有效,因为在加载模型一段时间后,但如果用户刷新页面,将无法正常工作,因为 url 错误。

为了解决这个问题,我使用了这个讨论论坛评论中的 3 方法,我们使用actionhelper 而不是linkTo. 唯一的区别是链接不会有带有url的href`属性,但是当点击所有作品时。

结果是:

App.PostShowRoute = Ember.Route.extend({
    events : {
        goToComment: function(context){
            this.transitionTo('comment.show', context);
        }
    }
});

这是一个完整实现的演示

于 2013-08-07T16:45:46.533 回答