如何在嵌套的forRoot模块中使用配置数据

时间:2018-01-07 06:28:09

标签: angular

我在我的项目中使用了一个核心模块来处理多个应用。每个应用程序都应该有一个不同的api url。核心模块导入包括许多外部库,其中许多需要配置对象才能导入它们。例如,ngx-jsonapi需要一个基本api url,因此,如何通过我的核心模块配置对象将每个应用程序的api url更改为外部模块。

我的例子中没有显示2点(尽可能简化问题),但确实需要知道:

  • 我正在使用配置服务在核心模块的许多地方注入配置对象(主要是在核心服务中)。
  • 从JSON文件加载的配置对象,以获取更改生产中配置的选项。

其中一个应用主要模块:

import {NgModule} from '@angular/core';
import {CoreModule} from '@app-common/core';

import {AppComponent} from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [
    CoreModule.forRoot({
      url: 'API-URL' <= Api url should to pass here.
    })
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}

以下是常见的核心模块:

import {NgxJsonapiModule} from 'ngx-jsonapi';
import {throwIfAlreadyLoaded} from '@app-common/core/module-import-guards';

@NgModule({
  imports: [
    NgxJsonapiModule.forRoot({
      url: 'API-URL' <= Api url should used from the config object that pass into the forRoot method of the core module.
    })
  ]
})
export class CoreModule {
  static forRoot(config: {url: string}): ModuleWithProviders {
    return {
      ngModule: ProteanCoreModule,
      providers: []
    };
  }
  constructor(@Optional() @SkipSelf() parentModule: CoreModule, router: Router) {
    throwIfAlreadyLoaded(parentModule, 'CoreModule');
  }
}

1 个答案:

答案 0 :(得分:0)

如果您想在应用程序范围内共享数据,那么我建议创建一个在Core模块中注册的服务(由App Module导入)或在AppModule本身注册。在根作用域注册的服务以单例形式提供,可以在任何地方注入 - 甚至可以从延迟加载的模块中注入。

或者,如果您尝试设置特定于环境的配置数据,那么我建议使用类似.env的库。此库允许您从映射到的.env设置配置变量process.env并且可以在构建时替换。