Accessing root Angular 2 injector instance globally

前端 未结 3 675
眼角桃花
眼角桃花 2020-12-13 22:13

How to access an instance of root Angular 2 injector globally (say, from browser console).

In Angular 1 it was angular.element(document).injector().

3条回答
  •  一整个雨季
    2020-12-13 22:43

    In Angular v.4.x.x the root injector is located on the PlatformRef. You can access it like this:

    import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
    
    // create a platform    
    let platform = platformBrowserDynamic();
    
    // save reference to the global object
    window['rootInjector'] = platform.injector;
    
    // boostrap application
    platform.bootstrapModule(AppModule);
    

    Or inside any component like this:

    export class AppComponent {
      constructor(platform: PlatformRef) {
          console.log(platform.injector);
    

    But the root injector is pretty useless. It contains mostly compiler and platform specific data and helpers:

    [
      "InjectionToken Platform ID",
      "PlatformRef_",
      "PlatformRef",
      "Reflector",
      "ReflectorReader",
      "TestabilityRegistry",
      "Console",
      "InjectionToken compilerOptions",
      "CompilerFactory",
      "InjectionToken Platform Initializer",
      "PlatformLocation",
      "InjectionToken DocumentToken",
      "InjectionToken Platform: browserDynamic",
      "InjectionToken Platform: coreDynamic",
      "InjectionToken Platform: core"
    ]
    

    You're probably looking for AppModule injector which you can get like this:

    platform.bootstrapModule(AppModule).then((module) => {
      window['rootInjector'] = module.injector;
    });
    

    You can extract ApplicationRef or root ComponentRef from it:

    platform.bootstrapModule(AppModule).then((module) => {
      let applicationRef = module.injector.get(ApplicationRef);
      let rootComponentRef = applicationRef.components[0];
    });
    

    Also, if Angular is running in the development mode, you can get either AppModule or lazy loaded NgModule injector like this:

    ng.probe($0).injector.view.root.ngModule
    

提交回复
热议问题