[APPsettings.json文件在APP_INITIALIZER上的应用程序初始化后加载

问题描述 投票:0回答:1

我一直试图在DevOps上部署Angular 8应用程序,并在.json文件中使用配置,以便不为不同的环境重新构建整个应用程序。

我使用这2个帖子来创建所有配置:

Continuously Deploying Angular to Azure App Service with Azure DevOps

和堆栈溢出答案:

App.settings - the Angular way?

注意我对使用environment.ts方式不感兴趣,因为这种方式将要求我为每种环境重新构建解决方案。

所以,我像这样准备了所有代码:

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule
    ],
    providers: [
        {
             provide: APP_INITIALIZER,
             useFactory: (appConfigService: ConfigService) => {
             return () => {
                //Make sure to return a promise!
                return appConfigService.loadAppConfig();
             };
          },
          deps: [ConfigService],
          multi: true
       }
    ],
    bootstrap: [AppComponent]
 })
 export class AppModule {}

我的ConfigService.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class ConfigService {
private appConfig: any;

constructor(private http: HttpClient) {}

loadAppConfig() {
  return this.http.get('./assets/appconfig.json')
    .toPromise()
    .then(config => {
      this.appConfig = config;
    });
}

get apiBaseUrl() {
    if (!this.appConfig) {
      throw Error('Config file not loaded!');
    }

    return this.appConfig.apiUrl;
  }
}

然后是需要加载appconfig.json信息的主要对象:

  export class ApiService {
  apiUrl: string;

     constructor(private readonly httpClient: HttpClient,
          private configService: ConfigService) { 
            this.apiUrl = this.configService.apiBaseUrl;
     }

     ngOnInit() {
       this.apiUrl = this.configService.apiBaseUrl;
     }    
  }

但是随后,在加载应用程序时,会出现此消息:

enter image description here

如果我调试应用程序,则appsettings.json文件正在加载信息,但是在加载应用程序设置之前看起来好像是在进行角度初始化。

我做错了什么?

angular angular8 angular2-services
1个回答
0
投票

您可以返回Promise并按以下方式在HTTP请求的subscribe回调中解析它:

loadAppConfig() {
  return new Promise((resolve) => {
     this.http.get('./assets/appconfig.json').subscribe(response => {
        this.appConfig = config;
        resolve();
     })
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.