2013-05-29 80 views
3

我试图围绕Ember资源包裹我的头,但我打了一堵墙。看着导游像Rails + Ember.js我看到声明的资源路径的优先停留的方式是:正确的Ember.js资源路由声明

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

这似乎很令人费解,不必创建一个嵌套的资源访问单个项目。但除了风格元素之外,真正的问题是这样的行为:从我在服务器端日志和客户端浏览器中看到的流量监控的这种路由会评估“帖子”路由和“帖子”的模型挂钩'路线。也就是说,考虑到模型挂钩:

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中的资源?我应该而不是申报资源,而是使用普通路线?

回答

1

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

另外请注意,你应该申报路由器如下,如果你不嵌套:

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

我错过了将路由嵌套与视图嵌套对齐的重要性。 route('posts'); route('post',{path:'/ posts /:post_id');'方法与'resource('posts',function(){route('post' ,{path:':post_id'});});'。第一个行为像Rails资源(从列表导航到详细信息并返回),但后者是正确的Ember资源,用于在客户端上同时显示列表和选定的详细信息*。 –

2

我创建了一个jsbin重现你在谈论的问题,改变了router代码位:

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

它不完全一样的东西嵌套路由(我认为,在引擎盖下post是处理嵌套)。

当您导航到PostsRoute,modelPostsRoute被解雇。如果您点击特定帖子,​​model挂钩不会被解雇。

但是,如果你去一个特定的职位并刷新页面,你会注意到这个时间​​model钩被激发。

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

希望这会有所帮助。

+0

+1,但我接受@Gevious,因为他指出,鉴于嵌套的重视与路线嵌套对齐。 –