Экспорт переменной в угловой AoT-компилятор - PullRequest
1 голос
/ 30 октября 2019

Я попытался реализовать динамическую конфигурацию, как видно из этого поста .

Все работает в компиляторе JiT, но я получаю

ERROR in Error during template compile of 'environment'
  Function calls are not supported in decorators but 'Environment' was called.

при попытке компиляции с помощью компилятора AoT.

Это мой environment.ts (класс примечания Environmentэкспортировано):

export class Environment extends DynamicEnvironment {
  public production: boolean;

  constructor() {
    super();
    this.production = false;
  }
}

export const environment = new Environment();

Я все еще хотел бы использовать среду стандартным образом some.component.ts:

import { environment } from '../environments/environment';

console.log(environment.config.property);

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Не. Серьезно, держитесь подальше от этих двух файлов (environment.ts и environment.prod.ts). Они НЕ касаются значения DevOps слова «окружение», они касаются констант отладки.

Если вам нужно знать, выполняете ли вы отладочную сборку, импортируйте isDevMode :

import { isDevMode } from '@angular/core';

Если вам нужна динамическая конфигурация, просто прочитайте Json откуда-нибудь или попросите серверную сторону внедрить его в виде тега скрипта, а затем прочитать его напрямую или с помощью внедрения зависимостей (это не так сложно сделать).

Но не связывайтесь с этими файлами. Поверь мне, ты поблагодаришь меня позже;)

0 голосов
/ 31 октября 2019

Решил это, создав config.module.ts и config.service.ts. Модуль конфигурации объявляет провайдеров:

@NgModule({
  providers: [
    ConfigService,
    {
      provide: APP_INITIALIZER,
      useFactory: (appConfigService: ConfigService) => () => appConfigService.loadAppConfig(),
      deps: [ConfigService],
      multi: true,
    },
  ],
})
export class ConfigModule {}

Использование службы конфигурации в some.component.ts:

@Component(...)
export class SomeComponent {
  constructor(private configService: ConfigService) { }

  private myMethod() {
    console.log(this.configService.get.property);
  }
}

Для тестов импортируется файл конфигурации json testing:

import { default as appTestConfig } from '../../../../assets/app-config.test.json';

и установить непосредственно в сервисе конфигурации:

TestBed.configureTestingModule({
  ...,
  imports: [
    ConfigModule,
    ...
  ],
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: (appConfigService: ConfigService) => () => appConfigService.setConfig(appTestConfig),
      deps: [ConfigService],
      multi: true,
    },
  ]
}).compileComponents();
...