我是一个角7应用程序与es6 Javascript版本和Swagger。
我试图将配置添加到APP_INITIALIZER中的app.module中:
export class SettingsProvider {
private config: AppConfig;
constructor(private httpClient: HttpClient) {}
public loadConfig(): Promise<any> {
return this.httpClient.get(`assets/configs/config.json`).pipe(
map(res => res as AppConfig))
.toPromise()
.then(settings => {
this.config = settings;
});
}
public get configuration(): AppConfig {
return this.config;
}
}在app.module中:
{ provide: APP_INITIALIZER, useFactory: init, deps: [SettingsProvider], multi: true },
{ provide: API_BASE_URL, useFactory: baseApiUrlSetting, deps: [SettingsProvider], multi: true },
export function init(settingsProvider: SettingsProvider) {
return () => settingsProvider.loadConfig();
}
export function baseApiUrlSetting(settingsProvider: SettingsProvider) {
return settingsProvider.configuration.baseApiUrl;
}在注入API_BASE_URL令牌之前,一切都很完美。编译器可能没有完成加载信任的操作,所以settingsProvider的值总是为null。
无法读取未定义的属性“baseApiUrl”
有人知道可能的解决办法吗?谢谢!
发布于 2019-06-12 20:57:17
我也遇到了同样的问题,最终得到了这样的解决方案:
main.ts
AppConfigService.loadConfig().then(() => {
return platformBrowserDynamic().bootstrapModule(AppModule);
})app-config-service.ts
import { Injectable } from '@angular/core';
import { AppConfig } from './app-config.models';
@Injectable({ providedIn: 'root' })
export class AppConfigService<T extends AppConfig = AppConfig> {
static appConfig: AppConfig;
constructor() { }
static loadConfig(): Promise<void> {
return new Promise((resolve, reject) => {
const oReq = new XMLHttpRequest();
oReq.addEventListener('load', (resp) => {
if (oReq.status === 200) {
try {
AppConfigService.appConfig = JSON.parse(oReq.responseText);
} catch (e) {
reject(e);
}
resolve();
} else {
reject(oReq.statusText);
}
});
oReq.open('GET', '/assets/configs/config.json');
oReq.send();
});
}
getConfig(): T {
return AppConfigService.appConfig as T;
}
}app-config.models.ts
export interface AppConfig {
ApiBaseUrl: string;
}app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { API_BASE_URL } from './nswag-client.service';
import { AppConfigService } from '../app-config-service';
export function getApiBaseUrl(): string {
return AppConfigService.appConfig.ApiBaseUrl;
}
@NgModule({
declarations: [
AppComponent,
...
],
imports: [
...
],
providers:
[
{
provide: API_BASE_URL,
useFactory: getApiBaseUrl
},
...
],
bootstrap: [AppComponent]
})
export class AppModule { }https://stackoverflow.com/questions/55460043
复制相似问题