2016-11-27 43 views
7

kullandığım Angular2 v2.2.3) işlevi:Angular2 - böyle ben forRoot (ortak modül oluşturduk</p> <p>asenkron bağımlılık enjeksiyon

export function ConfigFactory(http:Http):Promise<ConfigService> {  
    return http.get('confg/config.json').map(r => { 
     return new ConfigService(r); 
    }).toPromise(); 
} 
: Burada
... 
    public static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: CommonsModule, 
     providers: [ 
      SomeOtherDependency, 
      { 
       provide: ConfigService, 
       useFactory: ConfigFactory, 
       deps: [Http] 
      }     
     ] 
    }; 

benim ConfigFactory olduğunu

Promise ve Gözlemlenebilirleri de iade etmeye çalıştım. sağlayıcılar tanımlanan

SomeOtherDependency ConfigService gerektirir. Sorun şu ki, Açısal, söz tarafından çözülen değeri vermez, ancak söz verir.

Ben söz doğru bağımlılık çözülene kadar beklemek açısal zorlamak ve ancak o zaman diğer bağımlılıklar için enjekte nasıl?

Ben farklı yaklaşımlar denedim ve her zaman enjekte değer söz veya gözlemlenebilir. Tıpkı iniektörün hangi tip fabrikanın geri döndüğünü göz ardı etmesi gibi. Bütün uygulama Bir sorunum buldum

+0

Olası yinelenen:

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

Ve modülünde

: Burada APP_INITIALIZER ile çalışır fabrikayı güncellenir/sorular/38127741/açısal-2-hizmetler tüketen-diğerleri-hizmetler-öncesi-call-a-yöntemi) kontrol edin – estus

+0

da bu soruya http://stackoverflow.com/questions/40522938/lazy-loading-module için yorumlar -with-app-initializer? noredirect = 1 # comment68288686_40522938 – yurzui

+0

Sormadan önce bu konuları gördüm. Benim için çalışmıyorlar. –

cevap

3

başlamadan önce bazı json dosyaları yüklemek gerekir. Bunun yerine işlevini dönmek için gerektiğinde

benim fabrikadan bir söz dönüyordu. Ayrıca sağlayıcı bölümünden "çoklu" argümanı kaçırdım. [- önce başkalarının hizmetlerini bir yöntem çağırmak tüketen Hizmetleri Açısal 2] (http://stackoverflow.com

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

Bu değeri başka bir bileşende nasıl kullanabilirim? Lütfen plnkr.co kullanarak bir örnek gönderin – gtzinos

+0

Her zaman olduğu gibi kullanın: constructor (private configService: ConfigService) {}. Problemsiz enjekte edeceğim. –