嵌套路由的命名约定是什么?

时间:2013-08-22 13:46:21

标签: ember.js ember-data

(此问题与此jsbin

有关

我有以下路由器配置:

App.Router.map(function() {

    this.resource('profile', function () {
        this.route('user');
        this.route('userEdit');
        this.route('company');
        this.route('companyEdit');
        this.resource('products', function () {
            this.route('index');
            this.route('show',   { path: '/:product_id/show' });
        });
    });

});

有了这个,ember数据需要以下控制器:

  • ProfileIndexController
  • ProfileUserController
  • ProfileUserEditController
  • ProfileCompanyController
  • ProfileCompanyEditController

以下路线:

  • ProfileRoute
  • ProfileIndexRoute
  • ProfileUserRoute
  • ProfileUserEditRoute
  • ProfileCompanyRoute
  • ProfileCompanyEditRoute

以下模板:

  • 索引
  • 简档
  • 简档/索引
  • 简档/用户
  • 简档/ USEREDIT
  • 简档/公司
  • 简档/ companyEdit

但我无法解决嵌套的资源配置文件/产品。我期待控制器在:

  • ProfileProductsController
  • ProfileProductsIndexController
  • ProfileProductsShowController

路线:

  • ProfileProductsIndexRoute
  • ProfileProductsShowRoute

模板位于:

  • 简档/产品
  • 简档/产品/索引

相反,通过关注#/profile/products/index的链接,ember正在生成以下对象:

generated -> route:products Object {fullName: "route:products"}
generated -> route:products.index Object {fullName: "route:products.index"}
generated -> controller:products Object {fullName: "controller:products"}
Could not find "products" template or view. Nothing will be rendered Object {fullName: "template:products"}
generated -> controller:products.index Object {fullName: "controller:products.index"}
Could not find "products.index" template or view. Nothing will be rendered Object {fullName: "template:products.index"}
Transitioned into 'profile.products.index

这对我来说意外:产品嵌套在个人资料中!我当然可以更改我的控制器/路由/模板,但我想了解发生了什么。我看到的问题是顶级“产品”会与嵌套的“个人资料/产品”发生冲突。

对于生成对象名称(路由/视图/模板/控制器),ember如何处理嵌套资源。这记录在哪里? (特别是对于嵌套资源!)

2 个答案:

答案 0 :(得分:5)

我知道你已回答了自己的问题,但我可以提供更多见解。

检查this awesome article。这是对Ember中嵌套资源和路由的一个很棒的解释。

总结一下,每当你致电this.resource()时(在你的情况下this.resource('products')你正在创建一个新的命名空间,即使呼叫本身是嵌套的。

这意味着对resource的嵌套调用将生成ProductsController,而不是ProfileProductsController,以及ProductsView(和products模板)而不是ProfileProductsView。关联的模板需要{{outlet}}来呈现其中的子项。

此外,this.resource('products')将创建ProductsIndexController(以及products.index模板),因此您可以继续从项目资源中删除嵌套的this.route('index')调用。< / p>

答案 1 :(得分:0)

在写完这个长问题之后,我意识到这是一个documented功能。

对于我来说,如果有顶层资源和嵌套资源相同,会发生什么情况仍然不清楚。我猜这会引起冲突。我会说ember在这里假设太多:只有一种“产品”,但情况不一定如此。