我需要在收到$ 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);
}
};
}]);
}]);