2013-12-11 104 views
5

我想简洁地实现的方式将用户重定向到一个登录途径,如果他们没有登录。我立足我解掉的另一SO回答here那并不开箱即用。这是我的解决方案。重定向路由,如果用户没有通过验证

angular.module('myApp', ['ngResource', 'ngRoute']) 
    .config(['$routeProvider', function ($routeProvider) { 
    var requireAuthentication = function() { 
     return { 
      load: function ($q) { 
       console.log('Can user access route?'); 
       if (g_isloggedIn === true) { // fire $routeChangeSuccess 
        var deferred = $q.defer(); 
        deferred.resolve(); 
        console.log('Yes they can!'); 
        return deferred.promise; 
       } else { // fire $routeChangeError 
        console.log('No they cant!'); 
        return $q.reject("'/login'"); 
       } 
      } 
     }; 
    }; 

    $routeProvider 
     .when('/some_page_that_requires_authentication', { 
      templateUrl: '/views/secret.html', 
      controller: 'secretCtrl', 
      resolve: requireAuthentication() 
     }) 
     .when('/anybody_can_see_me', { 
      templateUrl: '/views/public.html', 
      controller: 'publicCtrl', 
     }); 
}]); 

我的问题是,我在哪里可以听上$routeChangeError事件,这样我也可以把路线?我试着在指令中做到这一点,但无法让事件触发。我不能将它放入控制器,因为如果承诺被拒绝,它将不会加载。有什么想法吗?

+0

你应该能够观察到它在任何控制器(或指令)它位于'NG-view'元素之外。 – Stewie

+1

甚至可以把它放在'run()'......你的代码中的一个小错误......需要调用'$ q.defer();'在你的'if'之前 – charlietfl

回答

3

是否有一个原因,你不应该在用户从函数内部重定向? 这正常工作对我来说,这不,如果承诺没有解决负载控制器/视图。

我修改这样的功能:

var requireAuthentication = function() { 
    return { 
     load: function ($q, $location) { 
      console.log('Can user access route?'); 
      var deferred = $q.defer(); 
      deferred.resolve(); 
      if (g_isloggedIn === true) { // fire $routeChangeSuccess 
       console.log('Yes they can!'); 
       return deferred.promise; 
      } else { // fire $routeChangeError 
       console.log('No they cant!'); 
       $location.path('/login'); 

       // I don't think this is still necessary: 
       return $q.reject("'/login'"); 
      } 
     } 
    }; 
}; 
+0

在哪里编写这段代码? .config()块中的 –

+0

也许?就像在问题中一样。或者在某个范围内?就这样可用。 – wiherek

0

我相信你早已过这个问题,但对于那些现在正在寻找的答案,这里是我的两分钱。

你错过这里的唯一的事情是,当承诺被拒绝会发生什么。您需要通过HTTP拦截来完成此操作。你把一个监听器放在routeChangeError中,并在那里重定向。 https://docs.angularjs.org/api/ng/service/$http(向下滚动到拦截部分)

相关问题