【问题标题】:AngularJS circular dependency issue with $http$http 的 AngularJS 循环依赖问题
【发布时间】:2014-08-04 19:09:39
【问题描述】:

我遇到了循环依赖问题。我构建了一个$http 拦截器来处理所有$http 错误并使用模态(Angular UI-Bootstrap)提醒用户。

依赖链如下所示:

$http <- $modal <- ErrorHandlerService <- HTTPErrorInterceptorService <- $http

我得到的错误是:

Uncaught Error: [$injector:cdep] Circular dependency found: $http <- $modal <- ErrorHandlerService <- HTTPErrorInterceptorService <- $http <- $templateFactory <- $view <- $state

我告诉read,解决这类问题的诀窍是使用$injector。我尝试使用$injector 注入$modal,我尝试使用$injector 注入ErrorHandlerService,但我仍然得到Circular dependency error。

有人知道如何解决这个问题吗?

谢谢!

【问题讨论】:

  • 似乎任何依赖$http服务的东西都不能注入$http拦截器。我还没有找到解决这个问题的任何方法,只是避免在拦截器中使用$http-dependant 的东西
  • 我想知道你是否可以在拦截器中做一个 $emit 或 $broadcast,只是一个想法。
  • 你试过这种方法吗:stackoverflow.com/a/19954545/2407203?

标签: angularjs


【解决方案1】:

mentioned question 中的trick 的重要一点是,您在拦截器运行时而不是在工厂中解析对$modal 的依赖关系。

这会起作用

angular.module('app')
  .factory('httpAuthInterceptor', function($q, $injector) {
    let $modal;  
    return {
      responseError: (rejection) => {
        if (rejection.status === 401) {
          $modal = $modal || $injector.get('$modal');
          $modal.open({
            template: 'not logged in'
          });
        }
        return $q.reject(rejection);
      }
    };
  })
;

这行不通

angular.module('app')
  .factory('httpAuthInterceptor', function($q, $injector) {
    let $modal = $injector.get('$modal');  
    return {
      responseError: (rejection) => {
        ...
      }
    };
  })
 ;

【讨论】:

  • 这对我不起作用,我仍然收到 cd 错误(我的拦截器中有自己的服务,它本身取决于 $http)
  • 为我工作。 @freshfelicio 在运行时通过 $injector 加载您自己的服务应该可以解决问题,因为由于 HTTP 拦截器取决于 $http,您显然拥有 CD。
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多