beroendeinjektion - @Inject utanför Angular2-applikation


Är det möjligt att hämta någon @Injectable som:

var config = @Inject(Config);

Tack

Svar #1

Om du vill få nya instanser från beroendeinjektion behöver du en referens till Injector och sedan kan du skaffa nya instanser med

injector.get(Config);

Hur du kan få en referens till Injector beror på var din kod är.
I en Angular-komponent eller tjänst, injicera den bara

constructor(private injector:Injector) {}

Du kan också bara skapa din egen injektor som

var injector = Injector.resolveAndCreate([Car, Engine]);

där Car och Engine är de leverantörer som injektorn kan skapa instanser för.

För att få injektorn i din Angular-applikation att användas utanför din Angular-applikation kan du använda

Exempel från https://github.com/angular/angular/issues/4112#issuecomment-153811572

let appInjectorRef: Injector;
export const appInjector = (injector?: Injector):Injector => {
    if (injector) {
      appInjectorRef = injector;
    }

    return appInjectorRef;
};

bootstrap(App, [
  Auth,
  HTTP_PROVIDERS,
  ROUTER_PROVIDERS,
  Car,
  Engine
]).then((appRef: ComponentRef) => {
  // store a reference to the application injector
  appInjector(appRef.injector);
});

let injector: Injector = appInjector();
injector.get(Car);

Svar #2

Jag tyckte det var lättare att deklarera injector som en global variabel så att jag kunde använda den lite enklare.

I filen där du startar upp Angular:

declare global {
    var injector: Injector;
}

bootstrap(/* your bootstrap stuff */).then((appRef) => {
    injector = appRef.injector;
});

Ovanstående kommer att ge dig tillgång till en injector-variabel var som helst annars i din kod.

I filen där du behöver en instans av Config:

import { Config } from './path/to/config.service';

class TestClass {
    private config: Config;

    constructor() {
        this.config = injector.get(Config);
    }
}