正确的Ember.js资源路由声明

Proper Ember.js resource route declaration

本文关键字:资源 路由 声明 js Ember      更新时间:2023-09-26

我正试图把我的头围绕烬资源,但我撞墙。看看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。我一定是忽略了显而易见的东西,但我说不出是什么。

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

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

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

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

当您导航到PostsRoute时,PostsRoutemodel钩子被触发。如果你点击了特定的帖子,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' }); 
});