Angular 提供商:为什么我的 useFactory 方法没有被调用?
Angular provider: Why is my useFactory method not being called?
-问题-
我正在尝试加载一个包含一些环境的配置文件以连接到 Okta 应用程序。
传递给 APP_INITIALIZER 的 useFactory:
的方法工作得很好,但是传递给 OKTA_CONFIG 的 useFactory:
的方法甚至从未被调用过。
我在方法中放置了一些 console.log() 消息,看看我能收集到什么,这是我在控制台中得到的:
loadConfig called!
core.js:6228 ERROR Error: Your Okta URL is missing...
来自 configService.oktaConfig() 的日志消息似乎没有发生。
-代码-
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { MaterialModule } from './modules/material/material.module';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { OKTA_CONFIG, OktaAuthModule } from '@okta/okta-angular';
import { HttpClientModule } from '@angular/common/http';
import { ConfigService } from './services/config.service';
@NgModule({
declarations: [
...
],
imports: [
BrowserModule,
OktaAuthModule,
AppRoutingModule,
BrowserAnimationsModule,
MaterialModule,
FormsModule,
HttpClientModule
],
providers: [
{ provide: APP_INITIALIZER, useFactory: appInitializerFactory, deps:[ConfigService], multi: true},
{ provide: OKTA_CONFIG, useFactory: oktaInitializerFactory, deps:[ConfigService], multi: false}
],
bootstrap: [AppComponent]
})
export class AppModule { }
export function appInitializerFactory(configService: ConfigService) {
return () => configService.loadConfig();
}
export function oktaInitializerFactory(configService: ConfigService) {
return () => configService.oktaConfig();
}
config.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpBackend } from '@angular/common/http';
export interface IOktaConfig {
pkce: boolean,
issuer: string,
redirectUri: string,
clientId: string
}
export interface IAppConfig {
production: boolean
oidc: IOktaConfig
}
@Injectable({
providedIn: 'root'
})
export class ConfigService {
private httpClient: HttpClient;
private config: IAppConfig;
constructor(handler: HttpBackend) {
this.httpClient = new HttpClient(handler);
}
public oktaConfig() {
console.log("oktaConfig called!")!
return this.config.oidc;
}
public async loadConfig(): Promise<any> {
return this.httpClient.get('assets/config.json').pipe(settings => settings)
.toPromise()
.then(settings => {
this.config = settings as IAppConfig;
console.log("loadConfig called!");
});
}
}
Return oktaInitializerFactory
上的实际数据而不是函数
export function oktaInitializerFactory(configService: ConfigService) {
return configService.oktaConfig();
}
我根据我对你上面写的场景的理解,提供了一个Stackblitz Demo,并提供了解决方案,如果我错过了,请告诉我东西。
-问题-
我正在尝试加载一个包含一些环境的配置文件以连接到 Okta 应用程序。
传递给 APP_INITIALIZER 的 useFactory:
的方法工作得很好,但是传递给 OKTA_CONFIG 的 useFactory:
的方法甚至从未被调用过。
我在方法中放置了一些 console.log() 消息,看看我能收集到什么,这是我在控制台中得到的:
loadConfig called!
core.js:6228 ERROR Error: Your Okta URL is missing...
来自 configService.oktaConfig() 的日志消息似乎没有发生。
-代码-
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { MaterialModule } from './modules/material/material.module';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { OKTA_CONFIG, OktaAuthModule } from '@okta/okta-angular';
import { HttpClientModule } from '@angular/common/http';
import { ConfigService } from './services/config.service';
@NgModule({
declarations: [
...
],
imports: [
BrowserModule,
OktaAuthModule,
AppRoutingModule,
BrowserAnimationsModule,
MaterialModule,
FormsModule,
HttpClientModule
],
providers: [
{ provide: APP_INITIALIZER, useFactory: appInitializerFactory, deps:[ConfigService], multi: true},
{ provide: OKTA_CONFIG, useFactory: oktaInitializerFactory, deps:[ConfigService], multi: false}
],
bootstrap: [AppComponent]
})
export class AppModule { }
export function appInitializerFactory(configService: ConfigService) {
return () => configService.loadConfig();
}
export function oktaInitializerFactory(configService: ConfigService) {
return () => configService.oktaConfig();
}
config.service.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpBackend } from '@angular/common/http';
export interface IOktaConfig {
pkce: boolean,
issuer: string,
redirectUri: string,
clientId: string
}
export interface IAppConfig {
production: boolean
oidc: IOktaConfig
}
@Injectable({
providedIn: 'root'
})
export class ConfigService {
private httpClient: HttpClient;
private config: IAppConfig;
constructor(handler: HttpBackend) {
this.httpClient = new HttpClient(handler);
}
public oktaConfig() {
console.log("oktaConfig called!")!
return this.config.oidc;
}
public async loadConfig(): Promise<any> {
return this.httpClient.get('assets/config.json').pipe(settings => settings)
.toPromise()
.then(settings => {
this.config = settings as IAppConfig;
console.log("loadConfig called!");
});
}
}
Return oktaInitializerFactory
上的实际数据而不是函数
export function oktaInitializerFactory(configService: ConfigService) {
return configService.oktaConfig();
}
我根据我对你上面写的场景的理解,提供了一个Stackblitz Demo,并提供了解决方案,如果我错过了,请告诉我东西。