将 environment.ts 传递给 Angular Library 模块



我正在构建一个 Angular 库,它将公开一个服务和中间件,以便在导入其他 Angular 应用程序时执行身份验证。

在尝试将此模块拉入独立的 Angular 库之前,它依赖于应用程序中的environment.ts文件(我只是像这样导入它:import { environment } from '../../../environments/environment';(。

如何将环境文件传递给现在将导入到我的 Angular 应用程序中的模块?

还是将environment文件作为 JSON 传递给我要公开的每个服务和中间件更好?

实现此目的的最佳方法是为模块公开配置对象,而不是直接使用环境文件。像这样:

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;
}

您可以使用 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){}

要使用 LIbrary:

imports:[LibraryModule.forRoot({...})]

最新更新