命名空间路由是否需要目录结构?

Is the directory structure expected for namespaced routes?

我创建了一个名为 checkoutnamespaced 路线。

我在 router.js 中有以下内容。

// router.js
this.route('checkout', function() {
  this.resource('payments', function() {
  });
});

可以通过以下途径访问:

http://localhost/checkout/payments

但是,payment 的控制器、模板、路由不存在于 checkout 目录中。我会想象:

app/controllers/checkout/payments/index.js
app/routes/checkout/payments/index.js
app/templates/checkout/payments/index.hbs

但它们存在并且可以通过 Ember 访问:

app/controllers/payments/index.js
app/routes/payments/index.js
app/templates/payments/index.hbs

这是预期的吗?

我不认为你可以在 routes 中嵌套 routes 你确定你不是在谈论 resources 吗?

A resource always resets the namespace.

The route, controller, and view class names for the comments resource are not prefixed with Post. Resources always reset the namespace, ensuring that the classes can be re-used between multiple parent resources and that class names don't get longer the deeper nested the resources are.

强调我的

它之所以有效,部分原因是 Asgaroth 所描述的:资源重置了名称空间,因此在您的示例中 ember-cli 正在寻找 class Payments 而不是 CheckoutPayments,部分原因是 ember-cli 支持两种目录布局(常规布局和 "pod" 布局)。在构建应用程序时,它从文件 目录中获取 classes 的名称,具体取决于哪个最合适。

您基本上是在混合和匹配文件系统布局的两种方法,这就是它起作用的原因。但是如果没有更好的结构,要弄清楚什么属于什么是非常困难的。

相反,我对它们使用 ember generate --pod ... 结构(应该推荐用于 Ember 2.0),这导致我的文件结构与您的问题有些相似:

app/map
├── debug
│   ├── controller.js
│   ├── route.js
│   └── template.hbs
├── index
│   ├── controller.js
│   └── template.hbs
├── settings
│   ├── controller.js
│   └── template.hbs
├── systems
│   ├── system
│   │   ├── route.js
│   │   └── template.hbs
│   ├── controller.js
│   ├── route.js
│   └── template.hbs
├── controller.js
└── template.hbs

是的,您可以嵌套路由(自 Ember 1.7 左右),并且对于 ES6 模块,通过路由使用资源几乎没有什么好处。我已经停止使用它们,根据上面的结构,我的 router.js 现在是一个相当微不足道的:

this.route( 'map', function() {
  this.route( 'systems', function() {
    this.route( 'system', { path: ':system_id' } );
  });
  this.route( 'settings' );
  this.route( 'debug' );
});

我强烈推荐你的路由器、控制器、mixin 和组件的 pod 结构。不过这需要一些时间来适应,而且你的编辑器必须显示目录名称才能知道你正在编辑什么。