繁体   English   中英

$ rootScope和工厂方法

[英]$rootScope and factory methods

我正在尝试通过.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方法,但是我仍然不太了解如何打破这种依赖性。 可能吗?

因此,您无法像在.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);
                . . .
            }

        });})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM