假设我有 4 条路线 - 2 条要求用户登录,2 条不需要。我的应用程序初始化如下所示:
$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'});
Routes /open1
and /open2
向所有人开放,而路线/secure1
and /secure2
要求用户登录,如果没有登录,则采取一些操作,例如重定向到登录或启动警告。我可以通过使用我的Auth
服务和呼叫,例如Auth.isLogin()
。所以结果是:
- 即将
/open1
and /open2
始终转到上面声明的模板和控制器
- if
Auth.isLogin()
返回真,/secure1
and /secure2
转到上面声明的模板和控制器
- if
Auth.isLogin()
返回假,/secure1
and /secure2
采取其他行动,例如$location.path('/login')
I could将逻辑放入Secure1
and Secure2
控制器进行检查,但这是重复的并且混淆了职责,使它们更难以测试等。
有什么方法可以让我使用$routeProvider
声明“检查此路由和此路由,如果没有,则重定向”?我正在考虑使用resolve
不知何故,但不太确定如何在(文档上resolve
不是很清楚,并且很少有有用的例子)。
EDIT:
根据下面的答案,似乎有三种哲学可以做到这一点:
- Using
resolve
检查登录并失败承诺,然后捕获$routeChangeError
要重定向的事件http://www.sitepoint.com/implementing-authentication-angular-applications/ http://www.sitepoint.com/implementing-authentication-angular-applications/
- 仅使用
$routeChangeStart
用于检查登录和重定向的事件http://arthur.gonigberg.com/2013/06/29/angularjs-role-based-auth/ http://arthur.gonigberg.com/2013/06/29/angularjs-role-based-auth/
- 仅使用解析来检查登录并重定向http://midgetontoes.com/blog/2014/08/31/angularjs-check-user-login http://midgetontoes.com/blog/2014/08/31/angularjs-check-user-login
第二个选项是两位回答者所建议的。
正如我上面的评论,有 3 种不同的路径(如果您想从 html 模板中控制它,还可以使用指令)。我最终跟随
https://midgetontoes.com/angularjs-check-user-login/ https://midgetontoes.com/angularjs-check-user-login/
其本质如下:
$routeProvider.when('/secure', {
templateUrl: '/secure.html',
controller: 'Secure',
resolve:{
loggedIn:onlyLoggedIn
}
});
进而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;
};
简单,就像魅力一样。如果我需要一个指令,我会将这一部分放入服务中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)