我想打开带角度材料的组件对话框。
我写这个代码:
sendMessage(): void {
const dialogRef = this.matDialog.open(SendMessageComponent, {
data: {
requestRefId: this.requestId
},
panelClass: 'semd_message'
});
dialogRef.afterClosed().subscribe(res => {
if (res) {
this.FetchMessage();
}
});
}
但当我想打开对话框时,它会显示这个错误:
No component factory found for SendMessageComponent. Did you add it to @NgModule.entryComponents?
at noComponentFactoryError (core.js:27401)
at CodegenComponentFactoryResolver.resolveComponentFactory (core.js:27477)
at CdkPortalOutlet.attachComponentPortal (portal.js:810)
at MatDialogContainer.attachComponentPortal (dialog.js:354)
at MatDialog._attachDialogContent (dialog.js:1161)
at MatDialog.open (dialog.js:1028)
at MessageComponent.sendMessage (message.component.ts:71)
at Object.handleEvent (message.component.html:3)
at handleEvent (core.js:45703)
at callWithDebugContext (core.js:47343)
在我的模块中,我在declarations
、entryComponents
、exports
中定义了SendMessageComponent。
@NgModule({
declarations: [ListComponent, SendMessageComponent],
imports: [
CommonModule,
BrowserAnimationsModule,
EMoneyDepositRoutingModule,
ReactiveFormsModule,
FormsModule ,
PageLayoutModule,
SecondaryToolbarModule,
TranslateModule.forChild(),
SharedModule,
CoreModule,
BreadcrumbsModule,
Angular2PromiseButtonModule.forRoot(promiseButtonConfig)
],
exports:[SendMessageComponent],
entryComponents: [SendMessageComponent]
})
export class EMoneyDepositModule { }
现在有什么问题?我该怎么解决这个问题
如果您遇到这个问题,我假设您使用Angular v8或更低版本。使用Ivy,您不再需要向entryComponents
中添加动态渲染组件。一种选择是升级你的棱角分明的版本。
为什么我们需要在entryComponents
中添加一个动态创建的组件
创建零部件时,Angular需要ComponentFactory
来解析这些零部件。在模板中使用零部件时,angular会为这些零部件创建工厂。但是,任何模板中都不会使用动态渲染的组件。这就是为什么您需要告诉Angular通过将这些组件添加到entryComponents
中来为它们创建一个工厂(对于Ivy-.k.Angular v9+,情况不再如此(。让我们看看你的案子。
您有一个延迟加载的模块EMoneyDepositModule
,并将SendMessageComponent
添加到entryComponents
中。这样做的目的是在注入树的子部分中为SendMessageComponent
创建一个工厂。仅适用于EMoneyDepositModule
以下的用户。该模块之外的任何人都不能注入该工厂。我假设matDialog
是全局提供的,您可以在任何地方访问它。但是,matDialog
无法访问延迟加载模块的工厂。
我已经能够重现你的问题了。在这里查看
所以你可以做以下之一
-
将
SendMessageComponent
添加到提供了模块matDialog
的entryComponents
。 -
以某种方式在您的延迟加载模块中提供一个
matDialog
。我假设您只需在EMoneyDepositModule
中导入MatDialogModule
即可实现这一点在上面的例子中,只需在lazy.module
中取消注释MatDialogModule
我看到了可能的原因:
新组件
根据@Random在评论中提到的,ng serve
可能无法正确使用新添加的组件。
另一个SendMessageComponent
您可能在ts导入语句中引用了另一个SendMessageComponent
。
循环参考
懒惰加载的模块会出现这种行为。请检查您的SendMessageComponent
和其他相关组件。SendMessageComponent
绝对不应从同一模块导入任何其他元素。请将可能的结果更改为相对导入。
我在Angular 12.1版本中遇到了同样的问题;没有找到"的组件工厂;。我最初以为IVY是用Angular 12.1自动安装的,但事实并非如此。在解决方案中,我更新了我的编译器以使用IVY,一切都按预期进行。查看此网站了解如何升级到IVY 的详细信息