angularjs - 如何在 Angular 中根据自身配置 $http 服务?

标签 angularjs angular-services angular-http angular-http-interceptors

我正在尝试配置 Angular 的 $http 服务,以在状态代码为 403 时重定向到 URL。

到目前为止没有问题,但要重定向到的 URL 来自服务器,通过使用 $http 的服务(显然)。

这是一段代码:

angular
.module('app')
.config(['$httpProvider', function($httpProvider) {
  $httpProvider.interceptors.push(['$q', 'URLs',
    function($q, Redirect) {
      return {
        request: function(config) {
          return config || $q.when(config);
        },
        responseError: function(response) {
          if(response.status === 403) {
            // redirect to URLs.login
          }
          return $q.reject(response);
        }
      };
    }
  ]);
}])
.factory('URLs', ['$http', function($http) {
  var URLs;
  $http.get('/urls').then(function(response) {
    URLs = response.data;
  });
  return URLs;
}]);

此代码在 Angular 中创建循环依赖关系(错误)。

有没有一种方法可以做到这一点,拥有来自服务器的动态 URL,并基于此在 response.status 为 403 时将用户重定向到其中一个?

最佳答案

使用$injector service延迟加载 URLs 服务:

angular
.module('app')
.config(['$httpProvider', function($httpProvider) {
  $httpProvider.interceptors.push(['$q', '$injector',
    function($q, $injector) {
      return {
        request: function(config) {
          return config || $q.when(config);
        },
        responseError: function(response) {
          var Redirect = $injector.get('URLs');
          if(response.status === 403) {
            // redirect to URLs.login
          }
          return $q.reject(response);
        }
      };
    }
  ]);
}])

您还可以通过在 URLs 服务中注入(inject) $injector 来打破这种循环依赖关系。

关于angularjs - 如何在 Angular 中根据自身配置 $http 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21909418/

相关文章:

javascript - AngularJS,共享数据服务多次触发

javascript - AngularJs $scope 就像本地变量一样

javascript - AngularJS 中的规范化 Controller

angularjs - Ionic ion-slide-box Update/Slide with ng-repeat

javascript - 如何以 Angular 将参数传递给服务中的函数

javascript - Ng-Checked 默认值未定义

javascript - 在 Angularjs 中,你如何改变每个测试的模拟服务?

javascript - 获取请求未满足 Angular-Express

javascript - AngularJS 1.4.3 ngRepeat 在具有隔离范围的指令中使用时打印 {{ variableName }} 而不是值

javascript - AngularJS 中的条件 View