Angular 角度提供者:为什么我的useFactory方法没有被调用?

Angular 角度提供者:为什么我的useFactory方法没有被调用?,angular,dependency-injection,okta,Angular,Dependency Injection,Okta,-问题- 我正在尝试加载一个配置文件,其中包含一些连接到Okta应用程序的环境。 传递到APP_初始值设定项的useFactory:的方法工作正常,但传递到OKTA_CONFIG的useFactory:的方法甚至从未被调用 我在方法中放置了一些console.log()消息,以查看我可以收集到什么,下面是我在控制台中得到的信息: loadConfig called! core.js:6228 ERROR Error: Your Okta URL is missing... 来自configSe

-问题- 我正在尝试加载一个配置文件,其中包含一些连接到Okta应用程序的环境。 传递到APP_初始值设定项的
useFactory:
的方法工作正常,但传递到OKTA_CONFIG的
useFactory:
的方法甚至从未被调用

我在方法中放置了一些console.log()消息,以查看我可以收集到什么,下面是我在控制台中得到的信息:

loadConfig called!
core.js:6228 ERROR Error: Your Okta URL is missing...
来自configService.oktaConfig()的日志消息似乎未发生

-代码-

app.module.ts

从'@angular/platform browser'导入{BrowserModule};
从“@angular/core”导入{APP_初始值设定项,NgModule};
从“./modules/material/material.module”导入{MaterialModule};
从“./app routing.module”导入{AppRoutingModule};
从“./app.component”导入{AppComponent};
从“@angular/platform browser/animations”导入{BrowserAnimationsModule};
从“@OKTA/OKTA angular”导入{OKTA_CONFIG,OktaAuthModule};
从'@angular/common/http'导入{HttpClientModule};
从“./services/config.service”导入{ConfigService};
@NGD模块({
声明:[
...
],
进口:[
浏览器模块,
Oktaauth模块,
批准模块,
BrowserAnimationsModule,
材料模块,
FormsModule,
HttpClientModule
],
供应商:[
{提供:APP_初始值设定项,useFactory:appInitializerFactory,deps:[ConfigService],multi:true},
{provide:OKTA_CONFIG,useFactory:oktaInitializerFactory,deps:[ConfigService],multi:false}
],
引导:[AppComponent]
})
导出类AppModule{}
导出函数appInitializerFactory(configService:configService){
return()=>configService.loadConfig();
}
导出函数OktainInitializerFactory(configService:configService){
return()=>configService.oktaConfig();
}
config.service.ts

从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpClient,HttpBackend};
导出接口IOktaConfig{
pkce:boolean,
发行人:字符串,
重定向URI:字符串,
clientId:string
}
导出接口IAppConfig{
生产:布尔型
oidc:IOktaConfig
}
@注射的({
providedIn:'根'
})
导出类配置服务{
私有httpClient:httpClient;
私有配置:IAppConfig;
构造函数(处理程序:HttpBackend){
this.httpClient=新的httpClient(处理程序);
}
公共oktaConfig(){
log(“调用了oktaConfig!”)!
返回this.config.oidc;
}
公共异步loadConfig():承诺{
返回此.httpClient.get('assets/config.json').pipe(设置=>settings)
.toPromise()
。然后(设置=>{
this.config=设置为IAppConfig;
log(“调用了loadConfig!”);
});
}
}

返回
OktainInitializerFactory
上的实际数据,而不是函数

export function oktaInitializerFactory(configService: ConfigService) {
   return configService.oktaConfig();
}

我已经提供了一个基于我对您上面所写场景的理解,使用提供的解决方案,如果我遗漏了什么,请告诉我。

这就成功了,谢谢。这也帮助我了解了注入令牌是如何工作的——现在我知道注入令牌是作为OktaConfig而不是函数键入的。没问题,很高兴它有帮助。非常感谢!:)