2014-10-03 91 views
1

我想通過.config()和$ delegate擴展AngularJS提供的$日誌,這樣我就可以捕獲所有對$ 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-1example-2),很顯然$ rootScope可以在工廠方法中使用。我很確定這是因爲我從.config文件中調用了.factory方法,但我仍然不明白如何打破這種依賴關係。可能嗎?

回答

1

因此,您無法直接引入您的logx,因爲您位於.config()塊中。

取而代之,引入$ injector服務並在日誌代理中獲取logx服務。

而且,你的裝飾器並不像裝飾器那樣裝飾得多。如果這是你的意圖,你可以創建自己的$日誌服務,而不是使用裝飾器。

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

我在一個小提琴中實現了這個解決方案(http://jsfiddle.net/rtubio/rfuzg0up/),它不起作用,它仍然說存在循環依賴。可能它與將$ rootScope作爲這個$ log裝飾器的依賴關係相關? – Ricardo 2014-10-03 18:15:10