2016-11-27 2 views
7

Ich benutze Angular2 v2.2.3Angular2 - asynchrone Dependency Injection

I gemeinsames Modul mit forRoot erstellt haben() Funktion, wie folgt aus:

... 
    public static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: CommonsModule, 
     providers: [ 
      SomeOtherDependency, 
      { 
       provide: ConfigService, 
       useFactory: ConfigFactory, 
       deps: [Http] 
      }     
     ] 
    }; 

Hier ist meine ConfigFactory:

export function ConfigFactory(http:Http):Promise<ConfigService> {  
    return http.get('confg/config.json').map(r => { 
     return new ConfigService(r); 
    }).toPromise(); 
} 

Ich habe versucht, auch Promise und Observable zurückzugeben.

SomeOtherDependency, die in Providern definiert ist, erfordert ConfigService. Das Problem ist, dass Angular keinen durch Versprechen versprühten Wert einbringt, sondern sich verspricht.

Wie kann ich angular zwingen zu warten, bis Versprechen mit der richtigen Abhängigkeit gelöst wird und dann nur in andere Abhängigkeiten injizieren?

Ich habe verschiedene Ansätze versucht und immer injiziert Wert ist Versprechen oder beobachtbar. Genau wie der Injektor ignoriert, welcher Typ Factory zurückgegeben wurde. Ich muss einige JSON-Dateien laden, bevor die ganze Anwendung startet

+0

Mögliche Duplikat [Angular 2 - Services andere Dienste vor rufen ein Verfahren raubend] (http://stackoverflow.com/questions/38127741/angular-2-services-consuming-andere-services-before-call-a-method) – estus

+0

Siehe auch Kommentare zu dieser Frage http://stackoverflow.com/questions/40522938/lazy-loading-module -with-app-initialisierer? noredirect = 1 # comment68288686_40522938 – yurzui

+0

Ich habe diese Themen schon gesehen, bevor ich gefragt habe. Sie arbeiten nicht für mich. –

Antwort

3

Ich habe ein Problem gefunden.

Ich gab ein Versprechen von meiner Fabrik zurück, als ich Funktion stattdessen zurückgeben musste. Auch habe ich "Multi" -Argument aus Provider-Bereich vermisst. Hier wird Fabrik aktualisiert, die mit APP_INITIALIZER funktioniert:

export function ConfigFactory(config:ConfigService, http:Http):Function { 
    return() => config.load(http); 
} 

Und in Modul:

providers: [ 
    ConfigService, 
    { 
     provide: APP_INITIALIZER, 
     useFactory: ConfigFactory, 
     deps: [ConfigService, Http], 
     multi: true 
    }, 
] 
+0

Wie kann ich diesen Wert für eine andere Komponente verwenden? Bitte senden Sie ein Beispiel mit plnrkr.co – gtzinos

+0

Verwenden Sie es wie immer: Konstruktor (private ConfigService: ConfigService) {}. Ich werde ohne Probleme injiziert werden. –