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

时间:2015-03-17 02:28:32

标签: javascript ember.js

基本上,如果用户登录,目标是呈现帐户页面,否则重定向到登录页面。

我有以下路线:

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 个答案:

答案 0 :(得分:4)

以下是一些可能对您有所帮助的想法:

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

    redirect: function () {
        if (!this.controller.get('loggedIn')) {
            this.transitionTo('login');
        }
    }
    
  2. 考虑将身份验证逻辑移动到Ember服务(example)。 Ember中的服务只是一个扩展Ember.Object的类。您将能够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, { 
        ... 
    }
    
  4. 还有很多其他很酷的东西!

    另外,我发现你还没有使用Ember CLI。一旦你对Ember感到更舒服,我就推荐它。 Ember CLI是Ember的未来,它带有略微不同的语法,但很多很棒的东西。