Angular 8 中延迟加载路由时无法解析动态实例化的组件

Can't resolve dynamically instantiated component when route is lazy loaded in Angular 8

我有一个延迟加载的模块,在延迟加载的模块中有一个这样的路由:

  {
    path: 'window',
    component: CustomerFormComponent,
    canActivate: [FormGuard],
  }

我使用 FormGuard 停止导航并打开一个对话框。我动态实例化组件 CustomerFormComponent,它在 window 中呈现。一切正常,直到我将这些路由移动到一个新模块(在路由中使用 loadChildren)以延迟加载模块。我遇到此错误是因为它在调用 this.componentFactoryResolver.resolveComponentFactory(componentType).

时无法解析组件
ERROR Error: No component factory found for CustomerFormComponent. Did you add it to @NgModule.entryComponents?
    at noComponentFactoryError (core.js:18113)

显然,如果我在 app.module.ts 中添加 entryComponents 中的组件,它可以工作,但如果我没记错的话,这会破坏延迟加载的目的,不是吗?

正确的方法是什么?

不,不是。

entryComponents 部分的作用是明确告诉 Angular 它应该保留这些组件的工厂以供进一步使用。

如果不在其中指定动态组件,您将无法动态创建组件。

甚至还有一个延迟加载模块的选项(与组件类似),它也有指定要延迟加载的模块以保留其工厂的要求。


不要将延迟加载与动态实例化混淆。

模块的动态加载使其在需要时加载(可以更改)。

动态组件只是一个选项,可以让您的组件即时运行、更改它并在您想要的任何地方注入,而无需使用模板。

因此,如果您在延迟加载模块的入口组件中指定动态组件,它将起作用,并且仅在加载模块时才加载。

P.S.

如果您想延迟加载某些组件,您需要创建另一个模块。 Make it lazy load。 然后创建一个服务解析器来加载这个模块,然后解析你想要的组件并完成工作。