找不到SendMessageComponent的组件工厂.您是否将其添加到@NgModule.entryComponen



我想打开带角度材料的组件对话框。

我写这个代码:

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)

在我的模块中,我在declarationsentryComponentsexports中定义了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无法访问延迟加载模块的工厂。

我已经能够重现你的问题了。在这里查看

所以你可以做以下之一

  1. SendMessageComponent添加到提供了模块matDialogentryComponents

  2. 以某种方式在您的延迟加载模块中提供一个matDialog。我假设您只需在EMoneyDepositModule中导入MatDialogModule即可实现这一点在上面的例子中,只需在lazy.module中取消注释MatDialogModule

我看到了可能的原因:

新组件

根据@Random在评论中提到的,ng serve可能无法正确使用新添加的组件。

另一个SendMessageComponent

您可能在ts导入语句中引用了另一个SendMessageComponent

循环参考

懒惰加载的模块会出现这种行为。请检查您的SendMessageComponent和其他相关组件。SendMessageComponent绝对不应从同一模块导入任何其他元素。请将可能的结果更改为相对导入。

我在Angular 12.1版本中遇到了同样的问题;没有找到"的组件工厂;。我最初以为IVY是用Angular 12.1自动安装的,但事实并非如此。在解决方案中,我更新了我的编译器以使用IVY,一切都按预期进行。查看此网站了解如何升级到IVY 的详细信息

相关内容

最新更新