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到上面去申报模板和控制器Auth.isLogin()返回false,/secure1并/secure2采取其他一些操作,例如$location.path('/login')我可以把逻辑放在Secure1和Secure2检查的控制器中,但这是重复的,混淆了责任,使它们更难测试等.
有没有办法可以$routeProvider用来声明,"检查这条路线和这条路线,如果没有,重定向"?我想用resolve某种方式,但不太确定如何使用它(文档resolve不是很清楚,几个有用的例子).
编辑:
根据以下答案,看来有三种理念可以做到这一点:
resolve检查登录和失败的承诺,然后捕捉$routeChangeError重定向事件http://www.sitepoint.com/implementing-authentication-angular-applications/$routeChangeStart事件检查登录并重定向http://arthur.gonigberg.com/2013/06/29/angularjs-role-based-auth/第二个选项是两位回答者提出的建议.
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)
简单,就像一个魅力.如果我需要一个指令,我会将这件作品提供给服务.
| 归档时间: |
|
| 查看次数: |
22618 次 |
| 最近记录: |