Angular Universal: лениво загруженные модули, инициализированные до APP_INITIALIZER - PullRequest
0 голосов
/ 15 мая 2019

Мое приложение использует APP_INITIALIZER для динамического извлечения некоторой конфигурации из файла json перед инициализацией приложения.

При использовании угловых универсальных, лениво загруженные модули создаются на стороне сервера до разрешения обещанного, возвращенного при использовании APP_INITIALIZER.

Это прекрасно работает, если не использовать угловой универсальный. Это ошибка от angular universal или я что-то не так делаю?

app.module.ts

export function loadConfigService(configService: AppConfigService): Function
{
  return () => {
    return configService.load();
  };
}

@NgModule({
    //...
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: loadConfigService,
      deps: [AppConfigService],
      multi: true
    },

приложение-config.service.ts

export class AppConfig
{

  readonly apiUrl: string;
  //other properties
}


export let APP_CONFIG: AppConfig;

@Injectable()
export class AppConfigService
{


  constructor(private http: HttpClient, @Inject(PLATFORM_ID) private platformId: Object, @Optional() @Inject('serverUrl') protected serverUrl: string)
  {
  }

  public load()
  {
    console.log('in load');
    return new Promise((resolve, reject) => {

      const isBrowser = isPlatformBrowser(this.platformId);

      let baseUrl = isBrowser ? '' : this.serverUrl;

      this.http.get(`${baseUrl}/assets/config/conf.json`).pipe(catchError((error: any): any => {
        reject(error);
        return observableThrowError('Server error');
      })).subscribe((envResponse: any) => {
        let t = new AppConfig();

        APP_CONFIG = Object.assign(t, envResponse);
        console.log('in response');
        resolve(true);
      });

    });
  }
}

Дочерний модуль

import {APP_CONFIG} from "@utils/services/app-config.service";

export class LazyChildModule
{
  constructor()
  {
   console.log('in child constructor');
   //Here, APP_CONFIG is null

Выход без универсального:

in load
in response
in child constructor

Выход с универсальным:

in load
in child constructor
in response    
...