6

我有两个资源都具有相同的子资源:

App.Router.map(function() {
  this.resource('post', function() {
    this.resource('comments', function() {
      this.route('new');
    });
  });

  this.resource('product', function() {
    this.resource('comments', function() {
      this.route('new');
    });
  });
});

问题是 ember 路由器仅根据当前和父路由而不是整个层次结构来构建路由对象的名称。因此,它会尝试同时路由/posts/:id/comments/new和路由/products/:id/comments/newApp.NewCommentRoute对象。我能做些什么来解决这个问题?

这篇文章改编自GitHub 问题

4

3 回答 3

6

我将 James A. Rosen 的解决方案更进一步,它就像一种魅力。有点多余,但让事情变得更加直观:

App.Router.map(function() {
  this.resource('post', function() {
    this.resource('post.comments', { path: '/comments' }, function() {
      this.route('new');
    });
  });

  this.resource('product', function() {
    this.resource('product.comments', { path: '/comments' }, function() {
      this.route('new');
    });
  });
});

这现在允许您使用transitionTo('product.comments.new')App.register('route:product.comments.new', myRouteHandler)按最初预期的方式使用。

如果您不手动注册路由处理程序,Ember 甚至会优雅地在App.ProductCommentsNewRoute

唯一的缺点是定义具有与父资源相同的根名称的子资源名称的冗余。

于 2013-02-18T22:00:50.030 回答
4

指定路由时,路径默认为路由的名称,但您可以覆盖该行为。您可以通过在名称中添加更多信息来消除深层嵌套路由的歧义。有两种方法可以达到基本相同的结果:

App.Router.map(function() {
  this.resource('post', function() {
    this.resource('postComments', { path: '/comments' }, function() {
      this.route('new');
    });
  });

  this.resource('product', function() {
    this.resource('productComments', { path: '/comments' }, function() {
      this.route('new');
    });
  });
});
App.Router.map(function() {
  this.resource('post', function() {
    this.resource('comments', function() {
      this.route('newPost', { path: '/new' });
    });
  });

  this.resource('product', function() {
    this.resource('comments', function() {
      this.route('newPost', { path: '/new' });
    });
  });
});

在这两种情况下,路由器现在都会查找App.NewPostCommentsPathApp.NewProductCommentsPath。第一个优于第二个的优点是,如果你想在外部引用路由,它们看起来像“postComments.new”而不是“comments.newPost”。前者对我来说更好读。

于 2013-02-17T17:36:14.930 回答
1

两年过去了,Ember 有了很大的进步。

从 Ember 1.7 开始,路由也可以有子路由:http: //emberjs.com/blog/2014/08/23/ember-1-7-0-released.html#toc_new-features

所以我们可以将其重写为:

this.route('post', function() {
    this.route('comments', { path: '/comments' }, function() {
        this.route('new');
    });
});

this.route('product', function() {
    this.route('comments', { path: '/comments' }, function() {
        this.route('new');
    });
});
于 2015-03-04T14:48:38.330 回答