AngularJS 1.6-在配置阶段$ HTTP上,默认请求EnlectError,广播事件到主范围



我需要在收到$ http.defaults请求错误之后广播事件(主要是400个状态代码),但是我无法在配置阶段中访问$ Rootscope。

代码:

var app = angular.module('app', []);
app.config(['$httpProvider','$injector', function($httpProvider, $injector) {
    $httpProvider.interceptors.push(['$q', function($q) {
        return {
            'responseError': function (rejection) {
                /*
                Doesn't work: 
                $rootScope = $injector.get("$rootScope");
                $rootScope.$emit("RESPONSE_ERROR");
                */
                return $q.reject(rejection);
            }
        };
    }]);
}]);
app.controller("Controller",function($scope){
    $scope.$on("RESPONSE_ERROR",function(event,params){
        alert("WORKING!");
    });
});

有什么建议吗?谢谢。

该问题是由于本答案中解释的两个不同的喷油器而引起的。在上面的代码中,$injector是在配置阶段注入的代码,它涉及服务提供商。

应该在运行阶段注入另一个,以便访问$rootScope

之类的服务实例
$httpProvider.interceptors.push(function($q, $injector) { ... });

正如另一个答案已经解释的那样,可以将$rootScope直接注入拦截器。虽然$injector是避免拦截器中循环依赖性并在其中注入$http的常见方法。

您可以尝试以下代码将$rootScope注入自定义拦截器函数。

var app = angular.module('app', []);
app.config(['$httpProvider','$injector', function($httpProvider, $injector) {
    $httpProvider.interceptors.push(['$rootScope', '$q', function($rootScope, $q) {
        return {
            'responseError': function (rejection) {
                $rootScope.$broadcast('RESPONSE_ERROR', {
                    // Custom properties
                });
                return $q.reject(rejection);
            }
        };
    }]);
}]);

最新更新