Ember路由器命名约定

时间:2014-02-20 09:03:30

标签: ember.js

我需要在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)。看似不一致让我感到困惑。我原以为他们中的任何一个。

2 个答案:

答案 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)。在我看来,定义CapitalizedNestedRoutenested.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

我希望这可以帮到你!