2

(这个问题与这个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 data 需要以下控制器:

  • 配置文件索引控制器
  • 配置文件用户控制器
  • ProfileUserEditController
  • 简介公司控制器
  • ProfileCompanyEditController

以下路线:

  • ProfileRoute
  • ProfileIndexRoute
  • ProfileUserRoute
  • ProfileUserEditRoute
  • 简介公司路线
  • 简介公司编辑路线

以及以下模板:

  • 指数
  • 轮廓
  • 简介/索引
  • 个人资料/用户
  • 个人资料/用户编辑
  • 简介/公司
  • 简介/公司编辑

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

  • 简介产品控制器
  • 简介产品索引控制器
  • 简介产品展示控制器

路线在:

  • 简介产品索引路线
  • 公司简介产品展示路线

模板位于:

  • 简介/产品
  • 简介/产品/索引

相反,通过 ember 的链接#/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 如何处理嵌套资源。这是在哪里记录的?(专门针对嵌套资源!)

4

2 回答 2

5

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

看看这篇很棒的文章。这是对 Ember 中嵌套资源和路由的精彩解释。

总而言之,任何时候你调用this.resource()(在你的情况下this.resource('products'),你正在创建一个新的命名空间,即使调用本身是嵌套的。

这意味着嵌套调用resource将生成 a ProductsController、 notProfileProductsController以及 a ProductsView(和products模板)而不是 a ProfileProductsView。关联的模板将需要一个{{outlet}}来呈现它的孩子。

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

于 2013-08-23T12:49:04.850 回答
0

写完这个长长的问题后,我意识到这是一个记录在案的功能。

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

于 2013-08-22T13:46:21.343 回答