Ember.js: 如果在控制器中满足特定条件,则在路由器中重定向?

Ember.js: redirect in router if certain condition is satisfied in controller?

基本上,如果用户已登录,objective 会呈现帐户页面,否则会重定向到登录页面。

我有以下路线:

App.Router.map(function() {
  this.resource('account', { path: '/'});
  this.route('login', { path: '/login' });
})

我当前的代码试图访问路由中帐户控制器中的 loggedIn 属性:

App.AccountRoute = Ember.Route.extend({
  renderTemplate: function(controller) {
    var loggedIn = controller.get('loggedIn'); // ERROR: controller undefined
    if (!loggedIn) {
      this.transitionTo('login');
    }
  }
});

我应该在路由器中实现这个逻辑吗?为什么控制器在我的路线中未定义?谢谢!

这里有一些想法可能会对您有所帮助:

  1. 您的控制器并不总是存在。它是由 Ember 在第一次需要它时创建的。您可以使用 Chrome 扩展进行 Ember 调试以查看已经创建了哪些控制器。在您的情况下,它应该可用,因为您处于 renderTemplate 挂钩中。一般来说,重定向应该在 beforeModel 挂钩或 redirect 挂钩中完成:

    redirect: function () {
        if (!this.controller.get('loggedIn')) {
            this.transitionTo('login');
        }
    }
    
  2. 考虑将身份验证逻辑移至 Ember 服务(example). A service in Ember is simply a class that extends Ember.Object. You will have the ability to inject 该服务将移至您所有的控制器和路由中,以便它始终可用。

  3. 甚至更好:考虑使用处理身份验证和授权的优秀 ember-simple-auth。它将创建一个 session 服务,在您的应用程序中随处可用,因此您将能够执行以下操作:

    // Ensures the user is authenticated
    if (!this.get('session.isAuthenticated')) {
        this.transitionTo('login');
    }
    

    甚至更好(因为你不想到处复制粘贴那些东西):

    // This route is now authenticated!
    App.AccountRoute = Ember.Route.extend(AuthenticatedRouteMixin, { 
        ... 
    }
    

还有许多其他很酷的东西!

此外,我看到您还没有使用 Ember CLI。一旦您对 Ember 感到更舒服,我会推荐它。 Ember CLI 是 Ember 的未来,它的语法略有不同,但有很多很棒的东西。