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

时间:2014-04-10 15:42:54

标签: angularjs angular-ui-router

大家好我对角度很新,我对拦截器中处理重定向的最佳方法有疑问。

我的应用中有某些页面,如果我选择了某个帐户,我应该只能访问这些页面。因此,如果未选择帐户,我希望用户可以选择该帐户的路线。

以下是我失败的尝试:

    // 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-router,angular 1.2.6

另一个注意:我想把它放在另一个地方是一个state.resolve块。

谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

这样做

$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);

答案 1 :(得分:1)

  • 我想你可能想尝试$ location.path(destination)而不是$ state.go(destination)。
  • 您最好不要将重定向逻辑置于'request'块下,因为accountService.accountSelected()也可以发出请求。这是doc of $http interceptors
  • 如果您只有几条路线需要检查帐户,最好将它放在state.resolve块中,因为您指出或将其放入相应的控制器中。