在Angular中,动态加载模块需要使用根注入器服务。以下是一个示例解决方法:
DynamicModuleLoaderService
的服务,用于加载动态模块。在该服务中,注入Compiler
和Injector
服务。import { Compiler, Injectable, Injector, NgModuleFactory, NgModuleRef, Type } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class DynamicModuleLoaderService {
constructor(private compiler: Compiler, private injector: Injector) {}
async loadModule(moduleType: Type): Promise> {
const moduleFactory = await this.compiler.compileModuleAsync(moduleType);
return moduleFactory.create(this.injector);
}
}
DynamicComponentLoaderDirective
的指令,用于动态加载组件。在该指令中,注入DynamicModuleLoaderService
和ViewContainerRef
服务。import { Directive, Input, OnInit, ViewContainerRef } from '@angular/core';
import { DynamicModuleLoaderService } from './dynamic-module-loader.service';
@Directive({
selector: '[appDynamicComponentLoader]',
})
export class DynamicComponentLoaderDirective implements OnInit {
@Input() moduleType: any;
constructor(
private dynamicModuleLoaderService: DynamicModuleLoaderService,
private viewContainerRef: ViewContainerRef
) {}
ngOnInit(): void {
this.dynamicModuleLoaderService
.loadModule(this.moduleType)
.then((moduleRef) => {
const moduleFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(this.moduleType);
this.viewContainerRef.createComponent(moduleFactory);
});
}
}
appDynamicComponentLoader
指令并传入待加载的模块类型。
在上述代码中,DynamicModule
是动态加载的模块类型,shouldLoadModule
是一个布尔值,用于控制是否加载模块。
这样,当shouldLoadModule
为true
时,DynamicModule
就会被动态加载并显示在组件中。