我需要在ember中深度嵌套一些路径,我有类似的东西。
this.resource('wizards', {
path: '/wizards'
}, function() {
this.resource('wizards.google', {
path: '/google'
}, function() {
this.resource('wizards.google.register', {
path: '/register'
}, function() {
this.route('step1');
this.route('step2');
this.route('step3');
this.route('summary');
});
});
});
我所期待的是这样的结构:
url /wizards/google/register/step1
route name wizards.google.register.step1
route Wizards.Google.Register.Step1Route
Controller Wizards.Google.Register.Step1Controller
template wizards/google/register/step1
但我得到了这个:
url /wizards/google/register/step1 //as expected
route name wizards.google.register.step1 //as expected
route WizardsGoogle.Register.Step1Route
Controller WizardsGoogle.Register.Step1Controller
template wizards/google.register.step1
我没有得到的是ember何时停止使用大写(WizardsGoogle)并开始使用名称空间(WizardsGoogle.Register)。看似不一致让我感到困惑。我原以为他们中的任何一个。
答案 0 :(得分:3)
我使用深层嵌套资源遇到了同样的事情。虽然我不知道这是怎么发生的,但我能说的是你总是可以使用没有命名空间的CapitalizedNestedRoute,而Ember可以识别它。虽然在Ember Inspector中显示“WizardsGoogle.Register.Step1Route”。
在你的例子中我定义了这样的路线:
App = Em.Application.create();
App.Router.map(function() {
this.resource('wizards', function() {
this.resource('wizards.google', function() {
this.resource('wizards.google.register', function() {
this.route('step1');
this.route('step2');
this.route('step3');
});
});
});
});
App.IndexRoute = Em.Route.extend({
beforeModel: function() {
// Transition to step1 route
this.transitionTo('wizards.google.register.step1');
}
});
App.WizardsGoogleRegisterStep1Route = Em.Route.extend({
model: function() {
// You can see this alert when you enter index page.
alert('a');
}
});
在此示例中,应用会毫无问题地转换为WizardsGoogleRegisterStep1Route。如果你使用容器来找到这样的路线:
App.__container__.lookup('route:wizards.google.register.step1').constructor
它还会显示App.WizardsGoogleRegisterStep1Route
。它与Ember Guide描述的相同。 http://emberjs.com/guides/routing/defining-your-routes/#toc_nested-resources而Ember Guide并没有引入名称空间路由。
所以我认为最好根据Ember Guide的建议(总是使用CapitalizedNestedRoute)。在我看来,定义CapitalizedNestedRoute
比nested.namespace.route
更容易。
最后,如果您真的想使用命名空间路由/控制器/模板,可以查看Ember.DefaultResolver。检查API以了解如何扩展它,以便容器可以按照您自己的规则查找模块。
答案 1 :(得分:2)
路由在资源内“命名空间”。资源使用你所谓的大写,它们定义一个命名空间(对于要使用的路径)。
所以这套路线:
App.Router.map(function() {
this.resource('posts', function() {
this.route('new');
this.route('old');
this.route('edit');
this.route('whatever');
});
});
将导致具有以下名称的路线:
PostsRoute
PostsNewRoute
PostsOldRoute
PostsEditRoute
PostsWhateverRoute
然而,以下一组路线:
App.Router.map(function() {
this.resource('posts', function() {
this.resource('photos');
this.resource('comments');
this.resource('likes');
this.resource('teets');
});
});
将导致路线具有以下名称:
PostsRoute
PhotosRoute
CommentsRoute
LikesRoute
TeetsRoute
另请注意,资源中的资源不会“命名”到“父”资源,因此您将始终拥有以下格式:
{CapitalizedResourceName}Route // for resources
{CapitalizedParentResourceName}{RouteName}Route // for routes
我希望这可以帮到你!