首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用APP_INITIALIZER进行角加载配置

用APP_INITIALIZER进行角加载配置
EN

Stack Overflow用户
提问于 2020-05-07 07:41:36
回答 1查看 2.7K关注 0票数 0

我试图通过使用角8中的APP_INITIALIZER来加载配置文件(json)。

app-config.json

代码语言:javascript
复制
    {
  "substitutePictureLink": "../images/not_found.png",
  "noImageFound": "../images/404_not_found.png",
  "thumbnailProps": {
  "width": "400",
    "height": "400",
    "format": "PNG",
    "view": "Interior",
    "withdimensions": "true",
    "withdescription": "true"
  }
}

为了加载配置,我创建了一个Service config -service,如下所示:

app-config-service.ts

代码语言:javascript
复制
export class AppConfigService {

public get appConfig(): any {
    return this._appConfig;
}

public set appConfig(value: any) {
    this._appConfig = value;
}

private _appConfig: any;

constructor(
        private _httpClient: HttpClient,
    ) {
        console.log('constructor app-config-service'); 
        this.loadAppConfig();
    }

public loadAppConfig(): any { 
//also tried a promise here
    return this._httpClient.get('../../../assets/configs/app-config.json')
        .pipe(
            take(1)
        )
        .subscribe(
            (config) => {
                this._appConfig = config;
            }
        );

}

所以我需要在启动时加载配置;

应用程序-module.ts

代码语言:javascript
复制
providers: [
    AppConfigService,
    {
        provide: APP_INITIALIZER,
        multi: true,
        deps: [AppConfigService],
        useFactory: (appConfigService: AppConfigService) => {
            return () => {
                return appConfigService.loadAppConfig();
            };
        }
    }
],
bootstrap: [AppComponent],
})

export class AppModule {
}

当我尝试加载配置时,如下所示:

some-service.ts

代码语言:javascript
复制
    export class someService {

private _noImageFound = this._appConfigService.appConfig.noImageFound;

constructor(
        private _appConfigService: AppConfigService
    ) {
    }

...

public getThumbnail(): Observable<SafeUrl> {
        return this._httpClient.get(this._apiUrl + '/visual-tree/thumbnail?width=400&height=400', {
            responseType: 'blob',
        })
            .pipe(
                map((res: Blob): SafeUrl => this._blobToUrl.transform(res)),
                catchError((err: HttpErrorResponse): Observable<string> => {
                    this._logger.error(ErrorMessage.thumbnailNotLoaded, err);
                    return of(this._noImageFound);
                })
            );
    }
...

错误:

  • Uncaught :无法读取未定义

的属性“noImageFound”

此错误是在登录后直接发生的。有趣的是,app-config-service的构造函数被调用了两次。我猜那个服务的推荐信有什么奇怪的地方。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-07 14:07:19

原因是角质只是等待承诺,而不是可观察到的。如果您将loadAppConfig函数转换为返回一个承诺(尽管您的评论是这样说的,您已经尝试过了),那么它应该会修复您的问题。我已经创建了您在这个堆栈中描述的场景,希望这有帮助!

以下变动

代码语言:javascript
复制
return this._httpClient.get('../../../assets/configs/app-config.json') 
              .pipe(take(1)) 
              .subscribe((config) => { this._appConfig = config; });

代码语言:javascript
复制
return this._httpClient.get('assets/config/config.json')
        .toPromise()
        .then(result => {
         this.appConfig = result;
         return Promise.resolve(result);});}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61652355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档