2014-10-03 3 views
1

Я пытаюсь расширить $ log, предоставляемый AngularJS через .config() и $ delegate, чтобы я мог поймать все вызовы в $ log и $ broadcast. Таким образом, другие контроллеры могут поймать сообщения лога $ и обновляются независимо друг от друга другие части сайта:

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/):

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

Я видел много примеров в Stackoverflow (например, example-1 или example-2), где очевидно, что $ rootScope можно использовать в рамках заводского метода. Я уверен, что это потому, что я вызываю метод .factory из .config, но я до сих пор не очень хорошо понимаю, как разбить эту зависимость. Является ли это возможным?

ответ

1

Таким образом, вы не можете напрямую подключить свой logx, так как вы находитесь в блоке .config().

Вместо этого запустите службу инжектора $ и получите службу 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/) и он не работает, он по-прежнему говорит, что круговая зависимость существует. Может быть, это связано с включением $ rootScope в зависимость от этого декоратора $ log? – Ricardo

Смежные вопросы