angular 5,将配置数据传递到导入的子模块

Ari*_*ael 6 module angular

我的库中有一个主模块,可以调用它forRoot并传递一些配置数据(如此处所示,使用forRoot传递配置数据

export const MODULE_OPTIONS = new InjectionToken<ModuleOptions>('MODULE_OPTIONS');

@NgModule({
  imports: [
    MySubModule.forRoot(//needs access to options)
  ]
})
export class MyModule {
  static forRoot(options: ModuleOptions = {}): ModuleWithProviders {
    return {
      ngModule: MyModule,
      providers: [
        {
          provide: MODULE_OPTIONS,
          useValue: options
        }
        ]
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当将主模块“ MyModule”导入应用程序/模块时,我的子模块还需要访问我从外部提供的选项。

如何将提供的ModuleOptions传递MyModule.forRootMySubModule

小智 8

我找不到针对这种情况的任何官方方法,所以我找到了一种方法,但这是一种解决方法。

您可以在 MyModule.forRoot 函数中调用 MySubModule.forRoot 并分配提供程序。(但是如果子模块中有组件/指令,您也可以导入/导出子模块。)

export const MODULE_OPTIONS = new InjectionToken<ModuleOptions>('MODULE_OPTIONS');
    
@NgModule({
   //You don't have to import/export if MySubmodule doesn't have any component/directive declaration.
   imports: [MySubModule],
   exports:[MySubModule]  
})
export class MyModule {
   static forRoot(options: ModuleOptions = {}): ModuleWithProviders {
     //Now we are able to provide services/values that uses options in the MySubmodule.
     const moduleProviders= MySubmodule.forRoot(options).providers;
     moduleProviders.push({provide: MODULE_OPTIONS,useValue: options});
     return {ngModule: MyModule,providers: moduleProviders};
   }
}
Run Code Online (Sandbox Code Playgroud)