大家好我对角度很新,我对拦截器中处理重定向的最佳方法有疑问.
我的应用程序中有某些页面,如果我选择了一个帐户,我应该只能访问这些页面.因此,如果未选择帐户,我希望用户登录的路线选择帐户.
以下是我失败的尝试:
// within config
$httpProvider.interceptors.push(function($q, $injector){
return {
'request': function(config) {
var state = $injector.get('$state');
if(state.is('user.list')) {
var accountService = $injector.get('AccountService');
if(!accountService.accountSelected()){
// cancel the current request
var defer = $q.defer();
defer.resolve();
config.timeout = defer.promise;
state.go('account.select');
}
}
return config;
}
}
});
Run Code Online (Sandbox Code Playgroud)
这给我带来了无限循环.出于某种原因,当state.go发生火灾 - 并且它被重新拦截时,状态仍然是"user.list"
注意:我使用的是ui-router,角度为1.2.6
另一个注意事项:我想把它放在另一个地方是一个state.resolve块.
谢谢你的帮助!
我尽可能地把代码煮熟了.关于嵌套状态和事件处理/广播的事情导致无限循环.在Chrome中,我可以暂停它并看到它在Angular的$digest功能中永远循环.知道为什么吗?这是我的示例代码中的错误,还是Angular或UI路由器中的错误?
<!doctype html>
<html ng-app='bugapp' ng-controller='BugAppCtrl'>
<head>
<script src='//code.jquery.com/jquery-1.10.1.min.js'></script>
<!-- Angular 1.2.11 -->
<script src='//ajax.googleapis.com/ajax/libs/angularjs/1.2.11/angular.js'></script>
<!-- UI router 0.2.8 -->
<script src='//cdn.jsdelivr.net/angular.ui-router/0.2.8/angular-ui-router.js'></script>
<script>
angular.module('bugapp', ['ui.router'])
.run(function ($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
})
.config(function ($locationProvider, $stateProvider, $urlRouterProvider) {
$locationProvider.html5Mode(false);
$stateProvider
.state("root", {
abstract: true,
url: "/servletContext?asUser",
template: '<div ui-view></div>' // ???
})
.state("root.home", {
abstract: true,
url: "/home",
template: "<div ng-if='hasData()' ui-view ></div>"
})
.state("root.home.profile", {
url: "/profile",
template: '<div>whatever</div>' …Run Code Online (Sandbox Code Playgroud)