是否可以使用$ logProvider登录模块的配置块?

时间:2014-09-22 23:11:23

标签: javascript angularjs angularjs-service

我想在调试时将日志消息输出到控制台。在控制器中工作正常,但无法在模块配置块中工作,例如

angular.module('MyApp', [])
  .run(function($state){
    // run stuff here
  });
  .config(function($logProvider){
    $log.debug('Config debug message');
  });

我收到错误:

error TypeError: Cannot read property 'debug' of undefined

是否可以在模块的配置块中使用logProvider?

1 个答案:

答案 0 :(得分:17)

在配置阶段访问的

$logProvider用于配置日志服务,或者您可以使用decorators注入$provide来更改/利用logservice的行为。日志服务本身尚未在模块MyApp中实例化。您可以从核心ng获取记录器实例,并将其用于调试。

你可以这样做: -

 .config(function(){
     var $log =  angular.injector(['ng']).get('$log')
     $log.debug('Config debug message');
  });

$logProvider.$get将为您提供logservice的构造函数,您可以通过调用$injector.instantiate($logProvider.$get)来创建它的实例,但问题是它依赖于尚未实例化的窗口服务,所以最终你的记录器实例化将会失败。

另一个hacky方法是强制角度来通过在配置块中添加一个装饰器来立即执行记录器,您可以在需要任何配置记录之前将其设置为第一个配置块,之后您可以执行ctor $logProvider getter并获取记录器的实例。

.config(function($provide){
   //Just a dummy decorator
   $provide.decorator('$log', function($delegate){
      return $delegate;
  });

}).config(function($logProvider){
   //get logger instance
   var log = $logProvider.$get();
   log.debug("Got it");
});

<强> Plnkr