ChatGPT解决这个技术问题 Extra ChatGPT

Angular2 材质对话框有问题 - 您是否将其添加到 @NgModule.entryComponents?

我正在尝试关注 https://material.angular.io/components/component/dialog 上的文档,但我不明白为什么会出现以下问题?

我在我的组件上添加了以下内容:

@Component({
  selector: 'dialog-result-example-dialog',
  templateUrl: './dialog-result-example-dialog.html',
})
export class DialogResultExampleDialog {
  constructor(public dialogRef: MdDialogRef<DialogResultExampleDialog>) {}
}

在我的模块中,我添加了

import { HomeComponent,DialogResultExampleDialog } from './home/home.component';

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent,
    DashboardComponent,
    HomeComponent,
    DialogResultExampleDialog
  ],

// ...

然而我得到这个错误....

EXCEPTION: Error in ./HomeComponent class HomeComponent - inline template:53:0 caused by: No component factory found for DialogResultExampleDialog. Did you add it to @NgModule.entryComponents?
    ErrorHandler.handleError @ error_handler.js:50
    next @ application_ref.js:346
    schedulerFn @ async.js:91
    SafeSubscriber.__tryOrUnsub @ Subscriber.js:223
    SafeSubscriber.next @ Subscriber.js:172
    Subscriber._next @ Subscriber.js:125
    Subscriber.next @ Subscriber.js:89
    Subject.next @ Subject.js:55
    EventEmitter.emit @ async.js:77
    NgZone.triggerError @ ng_zone.js:329
    onHandleError @ ng_zone.js:290
    ZoneDelegate.handleError @ zone.js:246
    Zone.runTask @ zone.js:154
    ZoneTask.invoke @ zone.js:345
    error_handler.js:52 ORIGINAL EXCEPTION: No component factory found for DialogResultExampleDialog. Did you add it to @NgModule.entryComponents?
    ErrorHandler.handleError @ error_handler.js:52
    next @ application_ref.js:346
    schedulerFn @ async.js:91
    SafeSubscriber.__tryOrUnsub @ Subscriber.js:223
    SafeSubscriber.next @ Subscriber.js:172
    Subscriber._next @ Subscriber.js:125
    Subscriber.next @ Subscriber.js:89
    Subject.next @ Subject.js:55
    EventEmitter.emit @ async.js:77
    NgZone.triggerError @ ng_zone.js:329
    onHandleError @ ng_zone.js:290
    ZoneDelegate.handleError @ zone.js:246
    Zone.runTask @ zone.js:154
    ZoneTask.invoke @ zone.js:345

e
eko

角 9.0.0 <

从 Ivy 的 9.0.0 开始,不再需要 entryComponents 属性。请参阅弃用指南。

角 9.0.0 >

您需要将动态创建的组件添加到 @NgModule 内的 entryComponents

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent,
    DashboardComponent,
    HomeComponent,
    DialogResultExampleDialog        
  ],
  entryComponents: [DialogResultExampleDialog]

注意:在某些情况下,延迟加载的模块下的 entryComponents 将不起作用,作为一种解决方法,请将它们放在您的 app.module(根)中


谢谢!到处找这个。在我的特殊情况下,我需要将组件添加到 declarations 以使事情正常工作
每次当我想了解 NgModule 时,就会出现类似的情况,让你想知道这个框架是否需要如此复杂。至少错误消息有帮助。
如果你已经把它们放在里面怎么办?为什么会说他们不是?
@SamAlexander您的问题确实很广泛,但您会很感激,但请大胆猜测;你在你的延迟加载模块中使用它们吗?
延迟加载模块中的对话框从 2.0.0-beta.2 开始工作
S
Sunil Garg

您需要使用 @NgModule 下的 entryComponents

这适用于使用 ViewContainerRef.createComponent() 添加的动态添加的组件。将它们添加到 entryComponents 会告诉离线模板编译器编译它们并为它们创建工厂。

路由配置中注册的组件也会自动添加到 entryComponents,因为 router-outlet 还使用 ViewContainerRef.createComponent() 将路由组件添加到 DOM。

所以你的代码会像

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent,
    DashboardComponent,
    HomeComponent,
    DialogResultExampleDialog        
  ],
  entryComponents: [DialogResultExampleDialog]

呃......我有两个对话框,它们在其他方面是相同的,但一个我有一个指向它的测试路线。我删除了那条测试路线,果然……这条路线正在“帮助”我。 >:(
@Sunil Garg 我还有另一个问题。我的对话框显示,但它会在 1 秒内自动关闭。请帮我。
g
georg-un

发生这种情况是因为这是一个动态组件,而您没有将它添加到 @NgModule 下的 entryComponents

只需在此处添加:

@NgModule({
  /* ----------------- */
  entryComponents: [ DialogResultExampleDialog ] // <---- Add it here

看看 Angular 团队 是如何谈论 entryComponents 的:

entryComponents?: Array|any[]> 指定定义此模块时应编译的组件列表。对于这里列出的每个组件,Angular 都会创建一个 ComponentFactory 并将其存储在 ComponentFactoryResolver 中。

此外,这是 @NgModule 上的方法列表,包括 entryComponents...

如您所见,它们都是可选的(查看问号),包括接受一组组件的 entryComponents

@NgModule({ 
  providers?: Provider[]
  declarations?: Array<Type<any>|any[]>
  imports?: Array<Type<any>|ModuleWithProviders|any[]>
  exports?: Array<Type<any>|any[]>
  entryComponents?: Array<Type<any>|any[]>
  bootstrap?: Array<Type<any>|any[]>
  schemas?: Array<SchemaMetadata|any[]>
  id?: string
})

与我相同的情况并且不起作用:它显示:错误:未找到 DialogConfirmComponent 的组件工厂。你把它添加到@NgModule.entryComponents 了吗?任何想法?
您需要将其插入 ngAfterViewInit (来自@angular/core)
S
Simon_Weaver

如果您尝试在服务中使用 MatDialog - 我们称之为 'PopupService' 并且该服务在模块中定义:

@Injectable({ providedIn: 'root' })

那么它可能无法正常工作。我正在使用延迟加载,但不确定这是否相关。

你必须:

将您的 PopupService 直接提供给打开对话框的组件 - 使用 [提供:PopupService]。这允许它使用(通过 DI)组件中的 MatDialog 实例。我认为调用 open 的组件需要与此实例中的对话框组件位于同一模块中。

将对话框组件移动到您的 app.module (正如其他一些答案所说)

调用服务时传递 matDialog 的引用。

请原谅我的回答混乱,关键是 providedIn: 'root' 正在破坏,因为 MatDialog 需要搭载组件。


有时候是这样的!确实添加了您的服务来提供而不是查看入口组件,错误的错误消息!
对我来说也发生了同样的事情,但我无法从这个答案中理解,哪一点是解决方案?还是三个都需要?
我遇到过同样的问题
g
georg-un

在延迟加载的情况下,您只需要在延迟加载的模块中导入 MatDialogModule 即可。然后这个模块将能够使用自己导入的 MatDialogModule 渲染入口组件:

@NgModule({
  imports:[
    MatDialogModule
  ],
  declarations: [
    AppComponent,
    LoginComponent,
    DashboardComponent,
    HomeComponent,
    DialogResultExampleDialog        
  ],
  entryComponents: [DialogResultExampleDialog]

g
georg-un

虽然集成材质对话框是可能的,但我发现这种微不足道的功能的复杂性非常高。如果您试图实现非平凡的功能,代码会变得更加复杂。

出于这个原因,我最终使用了 PrimeNG Dialog,我发现它使用起来非常简单:

m-dialog.component.html

<p-dialog header="Title">
  Content
</p-dialog>

m-dialog.component.ts

@Component({
  selector: 'm-dialog',
  templateUrl: 'm-dialog.component.html',
  styleUrls: ['./m-dialog.component.css']
})
export class MDialogComponent {
  // dialog logic here
}

m-dialog.module.ts

import { NgModule } from "@angular/core";
import { CommonModule } from "@angular/common";
import { DialogModule } from "primeng/primeng";
import { FormsModule } from "@angular/forms";

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    DialogModule
  ], 
  exports: [
    MDialogComponent,
  ], 
  declarations: [
    MDialogComponent
  ]
})
export class MDialogModule {}

只需将对话框添加到组件的 html 中:

<m-dialog [isVisible]="true"> </m-dialog>

PrimeNG PrimeFaces documentation 易于理解且非常精确。


除非您不需要动态创建的组件,否则您不会面临主题启动问题。如果您尝试(即使使用primeng)创建使用动态组件创建的对话服务 - 您将面临完全相同的问题......
g
georg-un

您必须将其添加到 entryComponents,如 docs 中所指定。

@NgModule({
  imports: [
    // ...
  ],
  entryComponents: [
    DialogInvokingComponent, 
    DialogResultExampleDialog
  ],
  declarations: [
    DialogInvokingComponent,   
    DialogResultExampleDialog
  ],
  // ...
})

这是一个应用程序模块文件的 a full example,其中对话框定义为 entryComponents


L
LeftOnTheMoon

如果你和我一样,盯着这个线程想“但我不是想添加一个组件,我想添加一个保护/服务/管道等。”那么问题很可能是您在路由路径中添加了错误的类型。这就是我所做的。我不小心在路径的 component: 部分而不是 canActivate: 部分中添加了保护。我喜欢 IDE 自动完成功能,但你必须放慢速度并注意。如果您绝对找不到它,请对它所抱怨的名称进行全局搜索,并查看每个用法以确保您没有错误地使用名称。


D
Dela

就我而言,我将组件添加到声明和 entryComponents 并得到了相同的错误。我还需要将 MatDialogModule 添加到导入中。


M
MJ X

如果有人需要从服务调用 Dialog,这里是如何解决问题的。我同意上述一些答案,我的答案是如果有人可能面临问题,则在服务中调用对话。

创建一个服务,例如 DialogService 然后将您的对话功能移动到服务中,并将您的对话服务添加到您调用的组件中,如下面的代码:

 @Component({
  selector: "app-newsfeed",
  templateUrl: "./abc.component.html",
  styleUrls: ["./abc.component.css",],
  providers:[DialogService]
})

否则你会得到错误


d
do-ri

我有同样的问题,我在 EntryComponents 中有 dialogComponent,但它仍然无法正常工作。这就是我能够解决问题的方法。该链接位于先前已回答的帖子中:

https://stackoverflow.com/a/64224799/14385758


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅