2016-11-27 15 views
7

używam Angular2 v2.2.3Angular2 - asynchroniczny wtrysk zależność

Utworzyłem wspólny moduł z forRoot() funkcja, podobnie jak to:

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

Oto moja ConfigFactory:

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

Próbowałem również zwrócić obietnicę i obserwować.

SomeOtherDependency zdefiniowana w dostawcach wymaga usługi ConfigService. Problem polega na tym, że Angular nie wstrzykuje wartości z obietnicą, ale obiecuje sobie.

Jak mogę wymusić kątowe oczekiwanie, aż obietnica zostanie rozwiązana z odpowiednią zależnością i dopiero wtedy wprowadzić ją do innych zależności?

Próbowałem różnych podejść i zawsze wartość zastrzyku jest obiecująca lub obserwowalna. Podobnie jak iniektor ignoruje, jaki typ fabryki powrócił. Muszę załadować kilka plików json zanim zacznie się cała aplikacja

+0

Możliwy duplikat [kątowe 2 - Usługi spożywających usługodawców przed wywołaniem metody] (http://stackoverflow.com/questions/38127741/angular-2-services-consuming-other-services-before-call-a-method) – estus

+0

Sprawdź także komentarze do tego pytania http://stackoverflow.com/questions/40522938/lazy-loading-module -with-app-initializer? noredirect = 1 # comment68288686_40522938 – yurzui

+0

Widziałem te tematy, zanim zapytałem. Nie działają dla mnie. –

Odpowiedz

3

Znalazłem problem.

Otrzymałem obietnicę z mojej fabryki, gdy potrzebowałem zwrócić funkcję. Również brakowało argumentu "multi" z sekcji dostawcy. Tutaj jest aktualizowana fabryki, która współpracuje z APP_INITIALIZER:

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

I w module:

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

Jak mogę użyć tej wartości w innym komponencie? Proszę wysłać przykład używając plnkr.co – gtzinos

+0

Używaj go jak zawsze: constructor (private configService: ConfigService) {}. Zostanę wstrzyknięty bez problemów. –