为什么我需要在Ember.js中定义索引路由?

时间:2017-05-12 15:24:38

标签: javascript ember.js routes

以前,我的路线已定义:

this.route('username', {
  path: '/:username'
}, function() {
  this.route("room", {
    path: "/:room",
});

我把它改为:

this.route('username', {
    path: '/:username'
  }, function() {
    this.route('index')
});
this.route("room", {
  path: "/:room"
});

这很好用。但是除非我在username/index中明确定义索引,否则我的router.js路由不会加载。

以下工作:

this.route('username', {
  path: '/:username'
});
this.route("room", {
  path: "/:room",
});

这是正常行为吗?

1 个答案:

答案 0 :(得分:3)

route嵌套route时,假定父级有index路由。这在指南中引用了这个:https://guides.emberjs.com/v2.13.0/routing/defining-your-routes/#toc_index-routes

特别是,关键短语是:

  

在每个嵌套级别(包括顶级),Ember自动为/ path命名索引提供路由。要查看何时出现新的嵌套级别,请在看到某个功能时检查路由器,这是一个新级别。

因此,在您的示例中,由于room嵌套在username中,因此username会获得自动index路由。从嵌套中删除room后,index的默认username路由就会消失。

仅供参考,您甚至不必指定索引路由,只需提供空回调即可。 e.g:

this.route('username', {
    path: '/:username'
  }, function() {});

通过自动创建username/index路线,这将以相同的方式工作。

在我早期的一个Ember应用程序(1.x)中,我希望索引路径始终存在,无论(为了一致性),所以我定义了一个变量:

var NO_CHILDREN= function() {};

然后我可以编写我的路线,如:

this.route('username', {
    path: '/:username'
  }, NO_CHILDREN);

希望有所帮助