$ rootScope和工厂方法

时间:2014-10-03 16:51:04

标签: javascript angularjs angularjs-scope angularjs-factory

我正在尝试通过.config()和$ delegate扩展AngularJS提供的$ log,这样我就可以捕获所有对$ log和$广播的调用。这样,其他控制器可以捕获$ log消息并独立更新网站的其他部分:

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 个答案:

答案 0 :(得分:1)

因此,您无法直接引入logx,就像您在.config()块中一样。

相反,引入$ 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);
                . . .
            }

        });})