Динамическая инициализация угловых модулей - PullRequest
0 голосов
/ 14 января 2019

У меня есть угловое приложение, где LazyModule лениво загружается в модуль app-routing

{path:'lazy',loadChildren: './modules/lazy/lazy.module#LazyModule'}

Ленивый модуль содержит сервис LazyService. Этот сервис содержит метод для динамического создания маршрутов:

Мне нужно использовать функциональный модуль DynamicModule для трех разных маршрутов, и я использую

addDynamicRoute(data:any){

  let route:{};

  switch(data.moduleName){
    case 'ModuleA':
    case 'ModuleB':
    case 'ModuleC': route = {
                                path: 'apps/'+data.moduleName,
                                loadChildren: ()=>DynamicModule 

                            }
                            break;
    default:
              throw Error("Invalid module type")
              break;
  }


  this.router.config.push(route);
  this.router.resetConfig(this.router.config);
  console.log(this.router.config);
}

DynamicModule.ts выглядит следующим образом с SampleService в качестве поставщика

@NgModule({
  declarations: [ComponentA],
  imports: [
    CommonModule,
    DynamicRoutingModule //Routing for DynamicModule
  ],
  providers : [SampleService]
})
export class DynamicModule {}

Это работает, и я получаю три экземпляра SampleService, как и ожидалось.

Теперь я хотел бы передать метод moduleName из метода addDynamicRoute в LazyService для экземпляра SampleService, чтобы каждый экземпляр SampleService содержал определенное имя модуля.

Поэтому я попытался использовать forChild ()

loadChildren: ()=>DynamicModule.forChild(data.moduleName)

и изменил DynamicModule как

@NgModule({
  declarations: [ComponentA],
  imports: [
    CommonModule,
    DynamicRoutingModule //Routing for DynamicModule
  ]
})
export class DynamicModule {
  static forChild(moduleName:string): ModuleWithProviders{
    console.log(moduleName); //This gets executed

    return{  
      ngModule:DynamicModule,  
      providers:[SampleService,{provide: 'moduleName', useValue: moduleName}]
    };

   }
}

Конструктор SampleService

constructor(@Inject('moduleName') private mName:string) { 
    console.log('Instantiated service');
    this.moduleName = mName;
 }

Но это не работает и выдает ошибку. Не найдено метаданных NgModule для '[объекта объекта]' при попытке перейти к / lazy / ModuleA

Есть ли способ сделать это ???

...