在使用routeProvider在Angular中启动路由之前,如何检查登录或其他状态?

dei*_*tch 9 angularjs angular-routing

假设我有4条路线--2要求用户登录,2则不需要.我的app init看起来像:

        $routeProvider.when('/open1',{templateUrl:'/open1.html',controller:'Open1'});
        $routeProvider.when('/open2',{templateUrl:'/open2.html',controller:'Open2'});
        $routeProvider.when('/secure1',{templateUrl:'/secure1.html',controller:'Secure1'});
        $routeProvider.when('/secure2',{templateUrl:'/secure2.html',controller:'Secure2'});
Run Code Online (Sandbox Code Playgroud)

路由/open1/open2向所有人开放,而路线/secure1/secure2需要进行登录的用户,如果没有,采取一些行动,例如重定向到登录或启动一个警告.我可以通过使用我的Auth服务和呼叫来确定用户的状态,例如Auth.isLogin().结果将是:

  • 转到/open1/open2始终转到上面声明的模板和控制器
  • 如果Auth.isLogin()返回true,/secure1并且/secure2到上面去申报模板和控制器
  • if Auth.isLogin()返回false,/secure1/secure2采取其他一些操作,例如$location.path('/login')

可以把逻辑放在Secure1Secure2检查的控制器中,但这是重复的,混淆了责任,使它们更难测试等.

有没有办法可以$routeProvider用来声明,"检查这条路线和这条路线,如果没有,重定向"?我想用resolve某种方式,但不太确定如何使用它(文档resolve不是很清楚,几个有用的例子).

编辑:

根据以下答案,看来有三种理念可以做到这一点:

第二个选项是两位回答者提出的建议.

dei*_*tch 13

在上面的评论中,有3种不同的路径(如果你想从html模板中控制它,还可以使用指令).我最后跟着

https://midgetontoes.com/angularjs-check-user-login/

基本上如下:

$routeProvider.when('/secure', {
    templateUrl: '/secure.html', 
    controller: 'Secure',
    resolve:{
        loggedIn:onlyLoggedIn
    }
 });
Run Code Online (Sandbox Code Playgroud)

然后onlyLoggedIn:

var onlyLoggedIn = function ($location,$q,Auth) {
    var deferred = $q.defer();
    if (Auth.isLogin()) {
        deferred.resolve();
    } else {
        deferred.reject();
        $location.url('/login');
    }
    return deferred.promise;
};
Run Code Online (Sandbox Code Playgroud)

简单,就像一个魅力.如果我需要一个指令,我会将这件作品提供给服务.

  • 你的网址已经死了 (6认同)