2017-10-20 5 views
0

Dieser Code schlägt im Entwicklungsmodus mit Ahead of Time Compilation fehl.Angular 4 inject Konsole mit AOT

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] 
     } 
     ] 
    }; 
    } 
} 

Wie kann ich Konsole injizieren?

+0

Mögliche Duplikat [Fenster nicht definiert ist, wenn sie als useValue Anbieter mit kantigem 4 AoT verwendet] (https://stackoverflow.com/questions/43445947/window-is-undefined-when-used-as-usevalue- provider-mit-eckigen-4-aot) – estus

Antwort

1

Sie müssen useFactory für alles verwenden, was Sie für AOT injizieren möchten. Siehe die Änderungen fett und kursiv. Ich habe eine benannte Injektionsfabrik von "Console" hinzugefügt.

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] 
     } 
     ] 
    }; 
    } 
}