3

我正试图围绕 Ember 资源进行思考,但我碰壁了。查看Rails + Ember.js之类的指南,我看到声明资源路由的首选方式是:

EmberTester.Router.map(function() {
  this.resource('posts', function() {
    this.resource('post', { path: ':post_id' });
  });
}); 

这看起来很复杂,必须创建一个嵌套资源来访问各个项目。但除了样式元素之外,真正的问题是行为:从我在服务器端日志和客户端浏览器流量监控中可以看到的这样一个路由评估“posts”路由和“post”路由的模型钩子' 路线。也就是说,给定模型钩子:

EmberTester.PostsRoute = Ember.Route.extend({
  model: function() {
    return EmberTester.Post.find();
  }
});

EmberTester.PostRoute = Ember.Route.extend({
  model: function(params) {
    return EmberTester.Post.find(params.post_id);
  }
});

当访问 url 时,/posts/1 两个模型钩子都会被执行,所以服务器首先被要求提供所有帖子,然后是 post_id:1。我一定错过了明显的东西,但我无法确定它是什么。

有没有更简单的方法在 Ember 中声明资源?我应该声明资源而是使用普通路由吗?

4

2 回答 2

2

我创建了一个jsbin来重现您正在谈论的问题并router稍微更改了代码:

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

它与嵌套路由完全相同(我认为,在引擎盖下post被视为嵌套)。

当您导航到PostsRoute时,会触发model钩子。PostsRoute如果您单击特定帖子,PostRoute model则不会触发钩子。

但是,如果您转到特定帖子并刷新页面,您会注意到这个时间PostRoute model钩子被触发了。

您应该将名词视为resources(posts、post、orders 等),将动词(形容词)用作routes(new、show、edit 等)。

希望这可以帮助。

于 2013-05-30T05:13:39.737 回答
1

路由器中的嵌套转换为整个堆栈中的嵌套。如果您希望在左侧有一个帖子列表,然后在屏幕右侧编辑单个帖子(根据Ember 指南),那么嵌套将适合您。如果您不需要这种行为,则根本不需要嵌套您的路线。如果您需要像 /posts/comments/ 这样的相关信息,那么嵌套可能会更有用,如果没有某种帖子,您将永远找不到评论。

另请注意,如果您不嵌套,您可能应该如下声明路由器:

App.Router.map(function () {
  this.route('posts');
  this.route('post', { path: '/posts/:post_id' }); 
});
于 2013-05-30T08:52:39.287 回答