没有MatDialogRef的提供者

时间:2017-10-11 10:47:51

标签: angular angular-material2

我正在使用材料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添加到我的构造函数时,它给了我“MatDialogRef没有提供者”错误。请你帮我解决一下这个问题?

对话框的概述-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.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>

6 个答案:

答案 0 :(得分:17)

你会得到那个确切的

  

没有MatDialogRef

的提供者
如果您在dialog-overview-example.html <dialog-overview-example-dialog></dialog-overview-example-dialog>中加入对话框的组件html选择器,则会出现

错误,如@Repository public interface UserRepository extends CrudRepository<User, Integer> { }

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

答案 1 :(得分:15)

您需要在模块文件中导入此模块(默认情况下为app.module.ts):

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

并在模块声明中添加MatDialogModuleimports

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

修改

您需要通过this.dialogRef.close();传递数据,才能result工作subscribe。例如:

@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);
 }

}

答案 2 :(得分:4)

问题在于,您将<dialog-component></dialog-component>包含在代码中的某个位置,并使用@Inject将其注入视图。如果您从其中使用的任何template.html中删除了<dialog-component></dialog-component>,它就可以使用!

答案 3 :(得分:3)

2019年9月更新

许多Angular Material examples会将MatDialogRef导入显示为:

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

这将导致以下错误(例如,在创建服务以包装对话框组件的创建时):

ERROR NullInjectorError: StaticInjectorError(AppModule)[DialogComponent -> MatDialogRef]: 
  StaticInjectorError(Platform: core)[DialogWarningComponent -> MatDialogRef]: 
    NullInjectorError: No provider for MatDialogRef!

正确导入:“ @ angular / material”

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

material.module.ts

如果角度材质 module 使用导入from '@angular/material/dialog',也会发生此错误。建议如下构造材料模块:

import { NgModule } from '@angular/core';
import { CdkTableModule } from '@angular/cdk/table';
import { CdkTreeModule } from '@angular/cdk/tree';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { ScrollDispatchModule } from '@angular/cdk/scrolling';

import {
  MatAutocompleteModule,
  MatBadgeModule,
  ...
  MatDialogModule,
  ...
} from '@angular/material';

@NgModule({
  exports: [
    CdkTableModule,
    CdkTreeModule,
    DragDropModule,
    ScrollDispatchModule,

    MatAutocompleteModule,
    MatBadgeModule,
    ...
    MatDialogModule,
    ...
  ]
})
export class MyMaterialModule { }

答案 4 :(得分:2)

从DialogOverviewExample组件中删除MatDialogRef。你不需要那里。它应该工作。

答案 5 :(得分:2)

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

MatDialogRef只能注入作为对话框打开的组件中,否则就没有dialogRef了,因此会触发此错误。