Ember.js路由器v2 App.Router.map在文档中不一致?

时间:2013-01-16 23:56:24

标签: ember.js

我正在用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');
  });
});

这里指出一个“资源”应该用于名词路由,而“route”应该用于动词路由。

然后在“重定向到不同的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来获取要显示的项目,我只是不确定如何将流对象放到这些子路径中。

1 个答案:

答案 0 :(得分:2)

  

展望未来,创建路线的正确惯例是什么?

http://emberjs.com/guides/routing/defining-your-routes/

中描述的资源/路线方法
  

如何从顶级“资源”路线链接到嵌套的“路线”路线并通过相应的模型?

指定路径名称作为第一个参数,后跟任何所需的上下文。因此,在您的示例中,当从流模板创建“stream.details”链接时,您需要指定this作为上下文。

{{#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