【问题标题】:No provider for MatDialogRefMatDialogRef 没有提供者
【发布时间】:2017-10-11 10:47:51
【问题描述】:

我正在使用材料 2 版本 2.0.0-beta.12。我需要调整材质 Modal 的位置。我按照这个答案来做到这一点。 https://stackoverflow.com/a/44238699/8253445 由于 MdDialog 现在不可用,我使用了 {MatDialog, MatDialogRef, MAT_DIALOG_DATA}。

constructor(public dialog: MatDialog,public dialModRef:MatDialogRef<any>) {}

当我将 MatDialogRef 添加到我的构造函数时,它会给我“No provider for MatDialogRef”错误。请问你能帮我解决这个问题吗?

dialog-overview-example.ts

import {Component, Inject} from '@angular/core';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from 
'@angular/material';

@Component({
   selector: 'dialog-overview-example',
   templateUrl: 'dialog-overview-example.html'
})
export class DialogOverviewExample {

   animal: string;
   name: string;

   constructor(public dialog: MatDialog,public 
   dialModRef:MatDialogRef<any>) {}

   openDialog(): void {
       let dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
        width: '500px',
        data: { name: this.name, animal: this.animal }
   });

   dialogRef.afterClosed().subscribe(result => {
      console.log('The dialog was closed');
      this.animal = result;
   });
 }
}

@Component({
   selector: 'dialog-overview-example-dialog',
   templateUrl: 'dialog-overview-example-dialog.html',
})
export class DialogOverviewExampleDialog {

constructor(
  public dialogRef: MatDialogRef<DialogOverviewExampleDialog>,
@Inject(MAT_DIALOG_DATA) public data: any) { }

 onNoClick(): void {
   this.dialogRef.close();
 }

}

app.module.ts

entryComponents: [DialogOverviewExample,DialogOverviewExampleDialog]

dialog-overview-example-dialog.html

<h1 md-dialog-title>Hi {{data.name}}</h1>
<div md-dialog-content>
  <p>What's your favorite animal?</p>
  <md-form-field>
    <input mdInput tabindex="1" [(ngModel)]="data.animal">
  </md-form-field>
</div>
<div md-dialog-actions>
  <button md-button tabindex="2">Ok</button>
  <button md-button (click)="onNoClick()" tabindex="-1">No Thanks</button>
</div>

【问题讨论】:

  • 而不是any,给出您要在对话框中打开的组件类的名称。然后,在你的 entryComponents 中添加组件类。
  • 我现在这样做了..我仍然得到同样的错误:(

标签: angular angular-material angular-material2


【解决方案1】:

你会得到准确的

MatDialogRef 没有提供者

如果您将对话框的组件 html 选择器包含在 dialog-overview-example.html 中,例如 &lt;dialog-overview-example-dialog&gt;&lt;/dialog-overview-example-dialog&gt;,则会出错

不需要,不要在任何地方包含对话框组件的html选择器。

【讨论】:

  • 谢谢哈维尔,这让我很生气,你的回答解决了它
  • 谢谢哈维尔,我真的很讨厌角度的那个方面。就好像错误是故意含糊的
  • 谢谢哈维尔。这解决了我的问题。
【解决方案2】:

你需要在你的模块文件中导入这个模块(默认app.module.ts):

import { MatDialogModule } from '@angular/material';

并在您的模块声明中将MatDialogModule 添加到imports

@NgModule({
  declarations: [...],
  imports: [
    ...
    MatDialogModule,
    ...
  ],
  providers: [...],
  entryComponents: [...],
  bootstrap: [...]
})

编辑:

您需要通过this.dialogRef.close(); 传递数据以使resultsubscribe 中工作。例如:

@Component({
   selector: 'dialog-overview-example-dialog',
   templateUrl: 'dialog-overview-example-dialog.html',
})
export class DialogOverviewExampleDialog {
someValue: boolean = false;

constructor(
  public dialogRef: MatDialogRef<DialogOverviewExampleDialog>,
@Inject(MAT_DIALOG_DATA) public data: any) { }

 onNoClick(): void {
   this.dialogRef.close(this.someValue);
 }

}

【讨论】:

  • 我导入了模块,当我从构造函数中删除 MatDialogRef 时对话框正在工作。我想知道为什么当我导入它时它停止工作:(
  • @kashifroshen 您是否已在模块声明中将组件(导入MatDialogRef)添加到entryComponents
  • 是的,我也这样做了:/ :/
  • 我找到了解决方案..而不是将其提供给 DialogOverviewExample 构造函数,而应将其提供给 DialogOverviewExampleDialog 构造函数..错误现在消失了..我在该类中调用 changePosition 但仍然是由于某种原因,位置没有更新。
  • 我有同样的问题,但我导入了 MatDialogModule。我该如何解决这个问题?
【解决方案3】:

2021 年更新

@angular/material/dialog 导入时导致错误 No provider for MatDialogRef 的 Angular 错误已修复。

导入MatDialogRef的正确方法是再次使用具体的组件入口点:

import {MatDialog} from '@angular/material/dialog';

角度材质模块

import {MatDialogModule} from '@angular/material/dialog';

@NgModule({
  exports: [
    MatDialogModule,
    ...
  ]
})
export class MyMaterialModule {}

 

2019 年 9 月的原始答案

许多Angular Material examplesMatDialogRef 导入显示为:

import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
这将导致以下**错误**(例如,在创建一个Service来包装Dialog Components的创建时):
ERROR NullInjectorError: StaticInjectorError(AppModule)[DialogComponent -> MatDialogRef]: 
  StaticInjectorError(Platform: core)[DialogWarningComponent -> MatDialogRef]: 
    NullInjectorError: No provider for MatDialogRef!

正确导入:'@angular/material'

从“@angular/material”导入 {MatDialog、MatDialogRef、MAT_DIALOG_DATA};

【讨论】:

  • 我正在为错误源头破脑袋。 “正确导入:'@angular/material'”这一点对我有用。谢谢老兄。
  • 组件不能再通过“@angular/material”导入。使用单独的辅助入口点,例如 @angular/material/button。
【解决方案4】:

问题是您将&lt;dialog-component&gt;&lt;/dialog-component&gt; 包含在代码中的某个位置,并使用@Inject 将其注入到您的视图中。如果您将 &lt;dialog-component&gt;&lt;/dialog-component&gt; 从您拥有的任何 template.html 中删除,它将起作用!

【讨论】:

    【解决方案5】:

    您在打开对话框的DialogOverviewExample 组件的构造函数中注入了MatDialogRef,但它不是对话框。

    MatDialogRef只能在以对话框打开的组件中注入,否则没有dialogRef所以会触发此错误。

    【讨论】:

    • 好点,我在进行重构时遇到了同样的问题,并将负责打开对话框的逻辑从组件移动到服务,所以我只是将 dialogRef 复制到服务构造函数中,这是一个复制粘贴错误。将 dialogRef 移到服务构造函数之外解决了这个问题。
    【解决方案6】:

    从 DialogOverviewExample 组件中移除 MatDialogRef。你在那里不需要它。那么它应该可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-13
      • 2021-05-06
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多