2014-02-20 3 views
5

У меня есть потребность в глубоком вложении некоторых маршрутов в ember, у меня есть что-то вроде этого.Соглашения об именах маршрутизаторов 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 

То, что я не получаю, когда делает уголек прекратить использование заглавных букв (WizardsGoogle) и начните использовать пространства имен (WizardsGoogle.Register). Казалось, что непоследовательность меня смущает. Я бы ожидал от них обоих.

+0

Нашли это обсуждение http: // discuss.emberjs.com/t/routers-nested-resource-implementation-is-extremely-limiting/927 –

+1

Это действительно интересная проблема, тем более, что документы ember, похоже, предполагают, что они должны работать точно так, как вы ожидали. Все, что я могу найти (посредством поиска/тестирования), состоит в том, что он, по-видимому, работает только на 1 уровне глубины ... хотя нет логической причины, почему это должно быть так. Здесь надеются, что кто-то сможет дать вам хороший ответ. – gravityplanx

ответ

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 не вводит маршрут пространства имен.

Поэтому я думаю, что лучше, согласно тому, что предлагает Ember Guide (всегда используйте CapitalizedNestedRoute). И, на мой взгляд, легче определить CapitalizedNestedRoute, чем nested.namespace.route.

Наконец, если вы действительно хотите использовать маршрут пространства/контроллер/шаблон пространства имен, вы можете посмотреть Ember.DefaultResolver. Проверьте API, чтобы узнать, как его расширить, чтобы контейнеры могли искать модули по вашим собственным правилам.

+0

Спасибо, что уточняет. Посмотрите, стоит ли расширять резольвер, или я просто буду придерживаться супер длинных имен. :) Все еще удивлялись, что они пошли с таким подходом. –

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 

Я надеюсь, что это поможет вам!

+1

Ну это я понимаю, так как это довольно простые примеры. Ember использует символ «Столица» каждый раз, когда «пространство имен» маршрутизируется под ресурсом. Я также понимаю, что ресурсы, вложенные, как вы говорите, «глобализированы», а не «PostsPhotos». Но почему 'wizards.google.register' превращается в' WizardsGoogle.Register', а не 'WizardsGoogleRegister' или' Wizards.Google.Register'. –

Смежные вопросы