正确的Ember.js资源路由声明
Proper Ember.js resource route declaration
我正试图把我的头围绕烬资源,但我撞墙。看看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' });
});
- API的快速路由-当您有子资源时的URL处理程序
- 非 HTML 资源的角度后端路由
- 如何设计基于angularJS资源的授权路由
- 余烬路由器 - 确定路由/资源是否为当前路由的子路由
- 检测角度依赖关系 [角度路由、角度资源等] 是否已加载用于 CDN 回退
- 在保存新的模型实例之后,在Ember.js中转换到路由之前,更新资源模型
- 在Express.js中,如何将通配符路由设置为与资源文件不匹配
- Node.js REST API服务中使用的基于资源的路由模块,或用于此类服务的其他有用模块
- 正确的Ember.js资源路由声明
- Rails混淆了js对实际路由的资源加载,并将其作为控制器动作处理
- Ember.JS中嵌套资源的路由命名
- Angular HTML5模式路由会导致无法找到资源
- 在emberjs中不使用资源出口的嵌套路由
- node . js,Express:没有找到动态路由上的静态资源
- 在AngularJS中,从两个资源调用中返回$promise来延迟路由更改
- Ember.js:在路由中嵌套资源
- 当我的路由在AngularJS中更改时,我如何保持资源数据
- 嵌套的资源路由触发父资源路由
- 关于余烬资源和路由的困惑
- 如何将子资源的新路由呈现到应用程序侧边栏出口中?