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

onb*_*lur 6 javascript angularjs angularjs-service

我想在调试时将日志消息输出到控制台.在控制器中工作正常,但不能让它在模块配置块中工作,例如

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

我收到一个错误:

error TypeError: Cannot read property 'debug' of undefined
Run Code Online (Sandbox Code Playgroud)

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

PSL*_*PSL 17

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

你可以这样做: -

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

$logProvider.$get将为您提供logservice的构造函数,您可以自己通过调用创建它的实例,$injector.instantiate($logProvider.$get)但问题是它依赖于尚未实例化的窗口服务,因此最终您的logger实例化将失败.

另一个hacky方法是强制角度来通过在配置块中添加一个装饰器来强制记录器,您可以在需要任何配置记录之前将其设置为第一个配置块,之后您可以执行ctorfrom $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");
});
Run Code Online (Sandbox Code Playgroud)

Plnkr