动态初始化角度模块

时间:2019-01-14 12:42:20

标签: module lazy-loading angular-services angular7

我有一个角度应用程序,其中LazyModule延迟加载到应用程序路由模块中

{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的三个实例。

现在,我想从LazyService的addDynamicRoute方法中为SampleService实例传递moduleName,以便每个SampleService实例都具有特定的moduleName。

所以我尝试使用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;
 }

但这不起作用,并且在尝试导航到/ lazy / ModuleA

时出现错误,未找到“ [object Object]”的NgModule元数据

有什么办法做到吗?

0 个答案:

没有答案