我正试图把我的头围绕烬资源,但我撞墙。看看Rails + Ember.js之类的指南,我发现声明资源路由的首选方式是:
EmberTester.Router.map(function() {
this.resource('posts', function() {
this.resource('post', { path: ':post_id' });
});
});
这看起来非常复杂,必须创建一个嵌套的资源来访问各个项目。但是除了风格元素之外,真正的问题是行为:这样的路由,从我在服务器端日志和客户端浏览器流量监控中看到的,评估了"post"路由和"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。我一定是忽略了显而易见的东西,但我说不出是什么。
我创建了一个jsbin来重现您正在谈论的问题,并更改了router
代码:
App.Router.map(function () {
this.resource('posts');
this.resource('post', { path: '/posts/:post_id' });
});
它与嵌套路由完全相同(我认为,在引擎盖下post
被视为嵌套)。
当您导航到PostsRoute
时,PostsRoute
的model
钩子被触发。如果你点击了特定的帖子,PostRoute
model
钩子不会被触发。
然而,如果你去到一个特定的帖子并刷新页面,你会注意到这次PostRoute
model
钩子被触发了。
你应该把名词当作resources
(posts, post, order等),动词(形容词)当作routes
(new, show, edit等)。
路由器中的嵌套转换为整个堆栈中的嵌套。如果你喜欢在左边有一个帖子列表,然后在你的屏幕的右手边编辑一个单独的帖子(按照烬指南),然后嵌套将为你工作。如果你不需要这种行为,你就根本不需要嵌套路由。如果你需要像/posts/comments/这样的相关信息,那么嵌套可能更有用,因为在这些信息中,如果没有某种post,你永远找不到注释。
还需要注意的是,如果你没有嵌套,你应该像下面这样声明Router:
App.Router.map(function () {
this.route('posts');
this.route('post', { path: '/posts/:post_id' });
});