我正在用ember.js创建一个应用程序.我从PRE.2开始,但最终使用了ember-data v11,因此升级为master用于ember.这意味着必须更改为新的v2路由器接口(作为旁注,我认为这样更好,所以谢谢.)
我在试图弄清楚它是如何工作的时候遇到了一些问题,我在指南中很深入但是有一些不一致我无法理解:
1)
似乎有两种不同的约定用于配置路由映射:
在“模板”部分中,使用match().to()接口
App.Router.map(function(match) {
match('/').to('index');
match('/posts').to('posts');
match('/posts/:post_id').to('post');
});
(这种方法也用于Tom Dale的gist)
在“路由”部分中,使用资源/路由接口:
App.Router.map(function() {
this.resource('posts', function() {
this.route('new');
});
});
这里指出,“资源”应该用于名词路由,而“路由”应该用于动词路由.
然后在“重定向到不同的URL”部分中,不遵循此名词/动词约定:
App.Router.map(function(match) {
this.resource('topCharts', function() {
this.route('choose', { path: '/' });
this.route('albums');
this.route('songs');
this.route('artists');
this.route('playlists');
});
});
我的第一个问题是:
展望未来,创建路线的正确惯例是什么?
我的第二个问题从那开始,与我的申请更相关:
如何从顶级“资源”路由链接到嵌套的“路由”路由并通过相应的模型?
(在“模板”文档的“链接”部分中有一个示例,但它与match().to()接口有关,我特别使用资源/路由接口)
这是我的例子:
我已经基于流创建了一个简单的站点结构,一个流由细节,一组帖子,句柄和历史组成.我的路由设置如下:
App.Router.map(function() {
this.resource('streams');
this.resource('stream', { path: '/stream/:stream_id' }, function(){
this.route('details');
this.route('posts');
this.route('handles');
this.route('history');
});
});
我的溪流路线看起来像这样:
App.StreamsRoute = Ember.Route.extend({
model: function() {
return App.Stream.find();
},
setupController: function(controller, model) {
controller.set('content', model);
}
});
和模板:
<script type="text/x-handlebars" data-template-name="streams">
<ul>
{{#each stream in controller}}
<li>{{#linkTo "stream" stream}} {{stream.title}} {{/linkTo}}</li>
{{/each}}
</ul>
</script>
我的流(单数)路线:
<script type="text/x-handlebars" data-template-name="stream">
<nav>
{{#linkTo "stream.details" }}Details{{/linkTo}}
</nav>
{{outlet}}
</script>
现在,我想链接到我的子路径“details”,但我不确定在linkTo中放置什么,以便我的模型(它是一个流)传递到这个子路径:
App.StreamDetailsRoute = Ember.Route.extend({ });
我的“详细信息”模板只显示流对象的一些属性.
<script type="text/x-handlebars" data-template-name="stream/details">
<h2>Stream Details</h2>
<p>Id: {{id}}</p>
<p>Title: {{title}}</p>
</script>
我还想链接到帖子,历史记录和处理子路径,并能够根据流模型显示这些聚合.我不确定该怎么做.我假设我需要使用setupController来获取要显示的项目,我只是不确定如何将流对象放入这些子路径中.
最佳答案
Going forward, what is the proper convention for creating routes?
资源/路由方法,如http://emberjs.com/guides/routing/defining-your-routes/中所述
How do I link from a top level “resource” route to a nested “route” route and pass through the appropriate models?
指定路由的名称作为第一个参数,后跟所需的任何上下文.因此,在您的示例中,当从流模板创建“stream.details”的链接时,您需要将其指定为上下文.
{{#linkTo "stream.details" this}}Details{{/linkTo}}
http://emberjs.com/guides/templates/links/中描述的方法仍然涵盖了基础知识.
如有疑问,我建议检查link_helper的测试用例.例如:https://github.com/emberjs/ember.js/blob/master/packages/ember/tests/helpers/link_to_test.js#L249