将$ http注入角度工厂($ exceptionHandler)会导致循环依赖

时间:2014-03-11 17:26:53

标签: angularjs circular-dependency

当我尝试将$ http注入重写的工厂时,我收到错误:

  

未捕获错误:[$ injector:cdep]找到循环依赖项:$ http< -   $ exceptionHandler< - $ rootScope

AngularModule.factory('$exceptionHandler',  function ($http) {

任何想法如何解决?如果我使用[]注入,$ http是未定义的

edit_的 _ __ _ __ _ __ _ __ _ __ _ _

根据下面的答案,我试过:

MyModule.config(function($provide, $http) {
    $provide.decorator("$exceptionHandler", function($delegate) {
        return function(exception, cause) {..

但我仍然收到循环错误:

  

未捕获错误:[$ injector:cdep]找到循环依赖项:$ http< -   $ exceptionHandler< - $ rootScope

3 个答案:

答案 0 :(得分:26)

注入$injector,然后从那里获取$http服务。像这样:

AngularModule.factory('$exceptionHandler',  function ($injector) {
    var $http = $injector.get("$http");

请参阅https://groups.google.com/forum/#!topic/angular/lbFY_14ZtnU/discussion

但是,这将完全覆盖Angular提供的$exceptionHandler功能。如果您只想将服务器端日志添加到现有功能,请参阅this question有关增强$exceptionHandler功能的信息。

答案 1 :(得分:3)

我正在使用此解决方案,因为rootScope存在循环依赖问题:

angular
  .module('facilityLog')
  .provider('$exceptionHandler', function() {
 "use strict";

 this.$get = function($injector) {

  function exceptionHandler(exception, cause) {
   // This is the part where you get the instance of $http in your case
   var $rootScope = $injector.get('$rootScope');
   //...
  }

  return exceptionHandler;

}});

因此,如果您在exceptionHandler-Function中请求实例,则不会获得循环依赖性错误。

答案 2 :(得分:2)

我使用以下方法来解决这个问题。注意如何使用数组符号来使这种缩小安全。 另请注意,我完全覆盖$ esceptionHandler并使用我自己的服务来替换它。

angular
    .module('app')
    .factory('$exceptionHandler', $exceptionHandler);

$exceptionHandler.$inject = ['$injector', 'exceptionLoggingService'];

function $exceptionHandler($injector, exceptionLoggingService)
{
    return function(exception, cause)
    {
        exceptionLoggingService.http = exceptionLoggingService.http || $injector.get('$http');
        exceptionLoggingService.error(exception, cause);
    };
}