Angularjs 如何在角度拦截器中执行重定向?

Angularjs 如何在角度拦截器中执行重定向?,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我是angular的新手,我有一个关于在拦截器中处理重定向的最佳方法的问题 我的应用程序中有某些页面,只有选择了某个帐户,我才能访问这些页面。因此,如果未选择帐户,我希望将用户发送到页面以选择帐户 以下是我失败的尝试: // within config $httpProvider.interceptors.push(function($q, $injector){ return { 'request': function(config)

我是angular的新手,我有一个关于在拦截器中处理重定向的最佳方法的问题

我的应用程序中有某些页面,只有选择了某个帐户,我才能访问这些页面。因此,如果未选择帐户,我希望将用户发送到页面以选择帐户

以下是我失败的尝试:

    // 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;
            }
        }
    });
这对我来说是一个无限循环。由于某种原因,当
state.go
触发时,它被重新截获,状态仍然是“user.list”

注意:我使用的是ui路由器,angular 1.2.6

另一个注意事项:我想到的另一个地方是state.resolve块。

这样做

$injector.get('$state').transitionTo('public.login');
完整代码如下

var interceptor = ['$location', '$q', '$injector', function($location, $q, $injector) {
    function success(response) {
        return response;
    }

    function error(response) {

        if(response.status === 401) {
            $injector.get('$state').transitionTo('public.login');
            return $q.reject(response);
        }
        else {
            return $q.reject(response);
        }
    }

    return function(promise) {
        return promise.then(success, error);
    }
}];

$httpProvider.responseInterceptors.push(interceptor);
  • 我想您可能想尝试$location.path(destination)而不是$state.go(destination)
  • 最好不要将重定向逻辑作为accountService放在“请求”块下。accountSelected()也可能发出请求。这是你的电话号码
  • 若您只有几个需要检查帐户的路由,那个么最好将其置于state.resolve block中,或者将其置于相应的控制器中
因此我不确定这种方法是否有效。我想截取请求,而不是响应。另外,当我使用transitiono vs state.go时,我得到了相同的行为,这只是一个例子。。您可以为请求/响应修改它$injector.get(“$state”)在我的情况下变空了,有什么线索吗?
$stateChangeStart
的侦听器对你有用吗?@zerofagl--很好的评论(+1)我刚刚尝试过--但仍然很不走运:我不知道这是否是最好的方法,但这对我有效,而另一个答案没有。