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。
然后创建一个服务解析器来加载这个模块,然后解析你想要的组件并完成工作。
我有一个延迟加载的模块,在延迟加载的模块中有一个这样的路由:
{
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。 然后创建一个服务解析器来加载这个模块,然后解析你想要的组件并完成工作。