适当的Ember.js资源路由声明

时间:2013-05-29 21:30:30

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

我试图绕着Ember的资源,但我正在撞墙。查看像Rails + Ember.js这样的指南,我看到声明资源路由的优先方式是:

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

这似乎非常复杂,必须创建一个嵌套资源来访问各个项目。但除了样式元素之外,真正的问题是行为:这样的路由,从我在服务器端日志和客户端浏览器中看到的流量监控来评估两个帖子的模型挂钩'路线和' 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);
  }
});

访问网址/posts/1 时,两个模型挂钩都会被执行,因此首先要求服务器发送所有帖子,然后查询post_id:1。我一定是错过了那个显而易见的东西,但我不能把手指放在它上面。

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

2 个答案:

答案 0 :(得分:2)

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

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

它与嵌套路由完全相同(我认为,引用的post是嵌套的)。

当您导航到PostsRoute时,model的{​​{1}}会被触发。如果您点击特定帖子,PostsRoute PostRoute挂钩将不会被解雇。

但是,如果您转到特定帖子并刷新页面,则会发现此时model PostRoute挂钩被触发。

你应该将善待名词用作model(帖子,帖子,命令等)和动词(形容词)作为resources(新的,显示,编辑等)。

希望这有帮助。

答案 1 :(得分:1)

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

另请注意,如果您没有嵌套,则应该如下声明路由器:

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