У меня есть угловое приложение, где 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
Есть ли способ сделать это ???