2014-10-03 8 views
1

AngularJS에서 제공하는 $ log를 .config() 및 $ delegate를 통해 확장하려고하므로 $ log 및 $ broadcast에 대한 모든 호출을 catch 할 수 있습니다. 이 방법은 다른 컨트롤러가 $ 로그 메시지와 웹 사이트의 업데이트 독립적으로 다른 부분을 잡을 수 있습니다 : 나는 보았다

Error: [$injector:cdep] Circular dependency found: $log <- $exceptionHandler <- $rootScope 

그러나

var app = angular.module('testApp', []) 
    .config(function($provide) { 
    $provide.decorator('$log', function($delegate, $rootScope, logX) { 
     return logX($delegate); 
    }); 
    }) 
    .factory('logX', function() { 
    return function($delegate, $rootScope) { 
     return { 
     log: function() { 
      console.log('[log] ' + arguments[0]); 
      $rootScope.$broadcast('XXXlogXXX', arguments[0]); 
     }, 
     info: function() { 
      console.info('[info] ' + arguments[0]); 
      $rootScope.$broadcast('XXXinfoXXX', arguments[0]); 
     }, 
     error: function() { 
      console.error('[error] ' + arguments[0]); 
      $rootScope.$broadcast('XXXerrorXXX', arguments[0]); 
     }, 
     warn: function() { 
      console.warn('[warning] ' + arguments[0]); 
      $rootScope.$broadcast('XXXwarningXXX', arguments[0]); 
     }, 
     } 
    }; 
    }) 
    .controller('naCtrl', ['$scope', '$log', 
    function($scope, $log) { 
     $scope.init = function() { 
     $log.info('INIT INVOKED!'); 
     }; 
    } 
    ]); 

을, 나는 다음과 같은 예외 (http://jsfiddle.net/rtubio/yu3882nv/2/)를 얻고 Stackoverflow에서 많은 예제 (예 : example-1 또는 example-2). $ rootScope가 팩토리 메소드 내에서 사용될 수 있다는 것은 명백합니다. 나는 그것이 .config 메소드에서 .factory 메소드를 호출했기 때문에 그것이 확실하다는 것을 확신하지만, 나는 여전히 의존성을 깨는 방법을 잘 모른다. 가능한가?

답변

1

.config() 블록에 있으므로 logx를 직접 가져올 수 없습니다.

대신 $ injector 서비스를 가져 와서 로그 대리인에 logx 서비스를 가져옵니다.

또한 데코레이터는 단순히 로거를 교체하는 것만 큼 장식하지 않습니다. 그게 당신의 의도라면, 데코레이터를 사용하는 대신 자신 만의 $ log 서비스를 만들 수 있습니다.

var app = angular.module('testApp', []) 
    .config(function($provide) { 
     $provide.decorator('$log', function($delegate, $rootScope, $injector) { 

      var originalLog = $delegate.log; 
      var originalError = $delegate.error; 
      . . . 

      $delegate.log = function() { 
       var logx = $injector.get('logx'); 

       originalLog.apply(null, arguments); 
       originalError.apply(null, arguments); 
       . . . 
       logx.log(arguments); 
       logx.error(arguments); 
       . . . 
      } 

     });}) 
+0

필자는이 솔루션을 Fiddle (http://jsfiddle.net/rtubio/rfuzg0up/)에서 구현했지만 작동하지 않지만 여전히 순환 종속성이 있다고 말합니다. 이 $ log 데코레이터의 종속성으로 $ rootScope를 포함하는 것과 관련된 것이 있습니까? – Ricardo

관련 문제