Передайте environment.ts в модуль библиотеки Angular

Я создаю библиотеку Angular, которая предоставит сервис и промежуточное ПО для аутентификации при импорте в другие приложения Angular.

Прежде чем пытаться поместить этот модуль в автономную Angular Library, он полагался на environment.ts файл в приложении (я просто импортировал его вот так: import { environment } from '../../../environments/environment';).

Как передать файл среды в модуль, который теперь будет импортирован в мое приложение Angular?

Или лучше передать файл environment в формате JSON каждой службе и промежуточному программному обеспечению, которое я раскрываю?


person VSO    schedule 17.10.2019    source источник
comment
Лучшее решение можно найти по этой ссылке stackoverflow.com/questions/43328785/   -  person San Jaisy    schedule 04.05.2020


Ответы (2)


Лучший способ добиться этого - предоставить объект конфигурации для вашего модуля вместо прямого использования файла среды. Что-то вроде:

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

export interface LibConfig {
  foo: string;
  bar: string;
}

export const LibConfigService = new InjectionToken<LibConfig>('LibConfig');

в вашем основном модуле:

export class LibModule {

  static forRoot(config: LibConfig): ModuleWithProviders {
    return {
      ngModule: LibModule,
      providers: [
        {
          provide:  LibConfigService,
          useValue: config
        }
      ]
    };
  }
}

и поэтому при добавлении библиотеки к импорту модуля вашего проекта вы можете:

LibModule.forRoot({
  foo: environment.foo,
  bar: environment.bar
})

а в библиотеке вы можете получить доступ к конфигурации примерно так:

  private libConfig: LibConfig;

  constructor(@Inject(LibConfigService) private config) {
    this.libConfig = config;
  }

  public getConfig(): LibConfig {
    return this.libConfig;
  }
person Henrique Erzinger    schedule 17.10.2019

Вы можете настроить модуль, используя шаблон forRoot.

В модуле вашей библиотеки:

export const OPTIONS = new InjectionToken<LibraryOptions>('options');

@NgModule({...})
export class LibraryModule {

  static forRoot(options: LibraryOptions): ModuleWithProviders {
  return {
   ngModule: LibraryModule,
   providers: [
   {
     provide: OPTIONS,
     useValue: options
   }]
  }
 }

}

затем введите токен OPTIONS в свои компоненты и службы, чтобы получить доступ к параметрам.

constructor(@Inject(OPTIONS) options: LibraryOptions){}

для использования библиотеки:

imports:[LibraryModule.forRoot({...})]
person Tiago Viegas    schedule 17.10.2019