延迟加载 Angular 13+ 个模块,没有弃用的编译器

Lazy loading Angular 13+ modules without the deprecated compiler

我与 loading and instantiating Angular modules 有过广泛的合作。 (没有路由器)

但是现在有了 Angular13,我看到了对用于实例化 NgModule 的常用编译器工具的弃用:

这是我常用的加载模块的代码

const moduleFactory = await this.compiler.compileModuleAsync(module);
const moduleRef = moduleFactory.create(this.injector);
const componentFactory = moduleRef.instance.resolveComponent(selector);

看得更深 ViewContainerRef 现在包含工厂的 V13 更改使动态组件更容易 1 步。但是,关于 ViewContainerRef.createComponent() 文档指出:

Deprecated Angular no longer requires component factories to dynamically create components. Use different signature of the createComponent method, which allows passing Component class directly.

那么 Angular13+ 中这些任务的新方向是什么?

您可以利用新的 createNgModuleRef 方法并替换以下步骤:

const moduleFactory = await this.compiler.compileModuleAsync(module);
const moduleRef = moduleFactory.create(this.injector);

const moduleRef = createNgModuleRef(module, this.injector);

您还可以在 Angular 文档 https://angular.io/guide/deprecations

中阅读所有弃用和可能的替代品

给你 导入 ViewContainerRef、Renderer2、Injector

创建内容元素

const messageText = this.renderer.createText('message');

创建组件 ref

const compRef = this.vcr.createComponent(<ComponentClass>, {Injector: this.injector, projectNodes: [[messageText]]});

如果你想要元素

const elem = compRef.location.nativeElement;

不使用工厂,就得用ViewContainerRef.createComponent。 参考下面link