2016-11-27 125 views
7

我用Angular2 V2.2.3Angular2 - 异步依赖注入

我创建通用模块forRoot()函数,就像这样:

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

这里是我的ConfigFactory:

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

我试图返回无极和可观察为好。

Provider中定义的SomeOtherDependency需要ConfigService。问题在于Angular没有注入承诺解决的价值,而是承诺自己。

如何强制角度等待,直到承诺解决了适当的依赖关系,然后将其注入其他依赖关系?

我试过不同的方法,总是注入价值是承诺或可观察。就像iniector忽略什么类型的工厂返回。我需要在整个应用程序启动前加载一些json文件

+0

的可能的复制[2个 - 服务消费等服务之前调用的方法(http://stackoverflow.com /问题/ 38127741 /角2的服务费时,其他服务前方的呼叫A-法) – estus

+0

退房也评论这个问题http://stackoverflow.com/questions/40522938/lazy-loading-module -with-APP-初始化?noredirect = 1个#comment68288686_40522938 – yurzui

+0

之前,我问我已经看到了这个话题。他们不适合我。 –

回答

3

我发现了一个问题。

当我需要返回函数时,我从工厂返回了一个承诺。另外我错过了来自提供者部分的“多”参数。这里被更新的工厂与APP_INITIALIZER工作:

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

而在模块:

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

如何在另一个组件上使用此值?请使用plnkr.co – gtzinos

+0

发送示例像往常一样使用它:构造函数(private configService:ConfigService){}。我会注入没有问题。 –