我正在尝试在我的应用程序中实现用户身份验证检查和访问检查系统,但是我一直遇到障碍。我想这次我的方法是正确的,但我还有最后一个障碍。
一点背景知识:我尝试将所有代码放入 $rootScope.on($startChangeStart) 并且它有效,可怕......但它有效。该路由始终被重定向,但由于后端的身份验证检查,它以每秒 1/2 的速度显示第一个请求页面,然后每次都显示重定向页面。因此,我尝试通过在 $startChangeStart 函数的开头调用 evt.preventDefault() 来“暂停”页面加载,该函数有效,但随后试图将用户放回原始路由会导致路由器中的无限循环。
因此,经过更多研究和阅读大量堆栈帖子后,我确定“解决:”是放置身份验证检查以确保页面在发生时不加载的正确位置,然后在需要时从 $ 重定向用户开始改变开始。(在我尝试将 $state 和 event 注入 resolve 函数时,它们总是未定义)这似乎是成功的组合。
我的问题:我已经解决了我的应用程序中的根状态:'main'
这是为了避免代码冗余,但是我无法确定如何从 $stateChangeStart 函数访问根状态的属性以及解析结果。toState 是子状态,而 fromState 是前一个状态或带有 '^' 路由的抽象状态...
我是否必须对每个子状态都下定决心才能使它起作用,或者有没有办法从此时访问根状态?
基本应用设置:
angular.module('App', ['ui.router', 'ui.bootstrap', 'ui.event', 'AngularGM', 'ngResource'])
.config(['$urlRouterProvider', '$stateProvider', function($urlRouterProvider, $stateProvider){
$urlRouterProvider
.when('/home', '/')
.when('', '/')
.when('/sign-up/joe', '/sign-up')
.otherwise('/');
$stateProvider
.state('main', {
url: '',
abstract: true,
templateUrl: 'views/main.html',
controller: 'MainCtrl',
resolve: {
checkAccess: ['accountService', function(accountService) {
accountService.checkAuth(function(){
accountService.checkAccess(function (access){
return access;
});
});
}]
}
})
.state('main.home', {
url: '',
abstract: true,
templateUrl: 'views/home.html',
controller: 'HomeCtrl'
})
.state('main.home.index', {
url: '/',
templateUrl: 'views/home/index.html'
});
.run(['$rootScope', '$state', '$stateParams', 'accountService', function ($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
console.dir(toState);
console.dir(toParams);
console.dir(fromState);
console.dir(fromParams);
if (!toState.checkAccess.allowed) {
event.preventDefault();
$state.transitionTo(toState.checkAccess.newState);
}
});
}]);
这是 console.dir() 调用两个状态对象的输出:
Object
name: "main.home.index"
templateUrl: "views/home/index.html"
url: "/"
__proto__: Object
Object
controller: "PlacesCtrl"
name: "main.places.search"
templateUrl: "views/places.html"
url: "/places"
__proto__: Object
更新
糟糕,忘了说 AngularJS 版本是 v1.2.0-rc.2
$state.current 控制台.dir()
Object
abstract: true
name: ""
url: "^"
views: null
__proto__: Object