是否有更简单的方法可以在不使用login
的情况下重定向到resolve: {}
状态?我的应用程序正在增长,并向个别状态添加loginRequired
或skipIfLoggedIn
等结果会使我的配置块混乱。如果有帮助,我会使用Satellizer进行身份验证。
示例模块路由配置:
(function () {
'use strict';
angular
.module('uberCoolModule')
.config(configRoutes);
configRoutes.$inject = ['$stateProvider'];
function configRoutes ($stateProvider) {
$stateProvider
.state('login', {
url : '/login',
templateUrl : 'entrance/login/login.html',
data : { pageTitle: 'Login' },
resolve: {
skipIfLoggedIn: skipIfLoggedIn
}
})
.state('logout', {
url : '/logout',
controller : 'Logout'
resolve: {
loginRequired: loginRequired
}
})
.state('members', {
url : '/members',
controller : 'Home'
resolve: {
loginRequired: loginRequired
}
});
function skipIfLoggedIn($q, $auth) {
var deferred = $q.defer();
if ($auth.isAuthenticated()) {
deferred.reject();
} else {
deferred.resolve();
}
return deferred.promise;
}
function loginRequired($q, $location, $auth) {
var deferred = $q.defer();
if ($auth.isAuthenticated()) {
deferred.resolve();
} else {
$location.path('/login');
}
return deferred.promise;
}
}
})();
答案 0 :(得分:1)
最简单的方法是拥有一个包含授权解析的父状态,并使所有需要登录的状态成为该父状态的子状态。
如果其中任何一个祖先状态被拒绝,则无法访问子状态
app.state('members', {
url: '/members',
controller: 'Home'
resolve: {
loginRequired: loginRequired
}
}).state('members.profile', {
url: '/profile',
});
在此示例中,如果/members/profile
被拒绝,转到loginRequired
将会失败