(此问题与此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数据需要以下控制器:
以下路线:
以下模板:
但我无法解决嵌套的资源配置文件/产品。我期待控制器在:
路线:
模板位于:
相反,通过关注#/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如何处理嵌套资源。这记录在哪里? (特别是对于嵌套资源!)
答案 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在这里假设太多:只有一种“产品”,但情况不一定如此。