Angularjs:如何在错误处理后重路由到另一个状态



我想在我的Angular应用中创建一个通用的错误处理程序。

例如,我收到一封链接为:mysite/messages/151的邮件点击此邮件:如果我没有登录,我的框架返回一个403(故意的)。

所以我创建了这个工厂。目前,它只查找403错误,然后将用户路由到登录页面。

app.factory('httpRequestInterceptor', ['$q', '$location', '$rootScope', function($q, $location) {
    return {
        'responseError': function(rejection) {
            if (rejection.status === 403) {
                $location.path('/user/login');
                return $q.reject(rejection);
            }
        }
    };
}]);

在app.config中我添加了这一行:

app.config(['$httpProvider', function($httpProvider)
{
    $httpProvider.interceptors.push('httpRequestInterceptor');

现在,当我得到一个403,我去正确的路径:/user/login到目前为止,一切顺利。

但是…我想以某种方式添加$state,这样我就知道调用url是什么(messages/151),这样我就可以返回到正确的位置并显示消息。

我不能在工厂中使用$state(错误是因为一些技术的东西,我还不理解($http vs $state?),所以现在我很困惑如何把事情做完。

所以,我想:

1)在URL出现403错误时进入登录状态(works)

2)从user (works)获取登录凭据

3)登录后返回URL是ok的(不提示)

也许我应该用另一种方法,但是我不明白。希望有人能帮帮我?

好了,这就是我想出来的。谢谢!

/**
 * Error handling on httpRequests.
 *
 * generic: use rejection.status like: if (rejection.status === 403) {return     $q.reject(rejection);}
 * custom:  check fromState['current']['name'] for state name
 *
*/
app.factory('httpRequestInterceptor', ['$q', '$location', '$injector', '$timeout', '$stateParams', function($q, $location, $injector, $timeout, $stateParams) {
    return {
        'responseError': function(rejection) {
            var fromState = $injector.get('$state');
            $timeout(function() {
                switch (fromState['current']['name']) {
                    case 'root.messages':
                        $injector.get('$state').go('root.login', $stateParams,
                                {location: false});
                        break;
                }
            }, 2000);
            return $q.reject(rejection);
        }
    };
}]);

广播方法很好,但我们也可以通过以下方式做到这一点。如果你使用ui-router来处理路由请求,那么你可以使用这个:N您的授权服务:

// There is a positive point to use this, your router will not get loaded before authorization
// $stateChangeStart call before routing to other state
rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
    if(!session.exists()){
        // Unauthorize User
        event.preventDefault();
        state.go("error");
    }else{
        // Normal Flow
        location.path(toState.url);
    }
});

相关内容

  • 没有找到相关文章

最新更新