【问题标题】:Proper Ember.js resource route declaration正确的 Ember.js 资源路由声明
【发布时间】:2013-05-29 21:30:29
【问题描述】:

我正试图围绕 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 both 模型钩子被执行,所以首先向服务器询问所有帖子,然后询问 post_id:1。我一定错过了明显的东西,但我无法确定它是什么。

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

【问题讨论】:

    标签: javascript ruby-on-rails ember.js ember-data


    【解决方案1】:

    我创建了一个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、orders 等),将动词(形容词)用作routes(new、show、edit 等)。

    希望这会有所帮助。

    【讨论】:

    • +1 但我接受了@Gevious,因为他指出了视图嵌套与路由嵌套对齐的重要性。
    【解决方案2】:

    路由器中的嵌套转换为整个堆栈中的嵌套。如果您想在左侧显示帖子列表,然后在屏幕右侧编辑单个帖子(根据Ember Guide),那么嵌套将为您工作。如果您不需要这种行为,则根本不需要嵌套您的路线。如果您需要像 /posts/cmets/ 这样的相关信息,嵌套可能更有用,如果没有某种帖子,您将永远找不到 cmets。

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

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

    【讨论】:

    • 我错过了将路线嵌套与视图嵌套对齐的重要性。 route('posts');route('post', {path:'/posts/:post_id'); 方法的含义与 resource('posts', function() {route('post', {path:':post_id'});}); 不同。第一个类似于 Rails 资源(从列表导航到详细信息并返回),但后者是正确的 Ember 资源,用于在客户端同时显示列表和选定的详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2013-11-04
    • 2014-05-05
    • 2023-04-08
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多