$rootScope和工厂方法

$rootScope and factory methods

本文关键字:方法 工厂 rootScope      更新时间:2023-09-26

我正试图通过.config()和$delegate扩展AngularJS提供的$log,这样我就可以捕获对$log的所有调用并对其进行$broadcast。通过这种方式,其他控制器可以捕捉$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-1或example-2),很明显$rootScope可以在工厂方法中使用。我很确定这是因为我从.config调用了.factory方法,但我仍然不太清楚如何打破这种依赖关系。有可能吗?

因此,您不能直接引入logx,因为您在.config()块中。

相反,引入$injector服务并在日志委托中获取logx服务。

同样,你的装饰师并没有像更换记录器那样多地进行装饰。如果这是您的意图,那么您可以创建自己的$log服务,而不是使用decorator。

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);
                . . .
            }
        });})