0

This code fails in development mode with Ahead of time compilation.

export function loggerFactory(console, http, device, injector) {
  return environment.production ?
         new LogstashLoggerService(device, injector, http) :
         new ConsoleLoggerService(console);
};

let consoleObj = window.console;

@NgModule({
  imports: [],
  exports: [],
  declarations: [],
  providers: [],
})
export class LoggerModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: LoggerModule,
      providers: [
        {provide: CONSOLE, useValue: consoleObj},
        {
          provide: Logger,
          useFactory: loggerFactory,
          deps: [CONSOLE, HttpInterceptor, DeviceService, Injector]
        }
      ]
    };
  }
}

How can I inject console?

Serginho
  • 7,291
  • 2
  • 27
  • 52
  • Possible duplicate of [window is undefined when used as useValue provider with Angular 4 AoT](https://stackoverflow.com/questions/43445947/window-is-undefined-when-used-as-usevalue-provider-with-angular-4-aot) – Estus Flask Oct 20 '17 at 17:51

1 Answers1

1

You have to use useFactory for anything you want to inject for AOT. See the changes in bold italic. I added a named injection factory of "Console".

import { Inject } from '@angular/core';

export function loggerFactory(@Inject('Console') console, http, device, injector) {
  return environment.production ?
         new LogstashLoggerService(device, injector, http) :
         new ConsoleLoggerService(console);
};


export function consoleFactory(): any {
    return console;
}


@NgModule({
  imports: [],
  exports: [],
  declarations: [],
  providers: [],
})
export class LoggerModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: LoggerModule,
      providers: [
        { provide: 'Console', useFactory: consoleFactory },
        {
          provide: Logger,
          useFactory: loggerFactory,
          deps: [CONSOLE, HttpInterceptor, DeviceService, Injector]
        }
      ]
    };
  }
}
Igor
  • 60,821
  • 10
  • 100
  • 175