Нет провайдера для MatDialogRef

Я использую материал 2 версии 2.0.0-beta.12. Мне нужно отрегулировать положение материала Modal. Я последовал этому ответу, чтобы сделать это. qaru.site/info/13581804/... Поскольку 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 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>

Ответ 1

Вы получите точные

Нет провайдера для MatDialogRef

ошибка в случае, если вы включаете в себя диалог html компонента диалога в dialog-overview-example.html например <dialog-overview-example-dialog></dialog-overview-example-dialog>

В этом нет необходимости, не включайте html-селектор компонента диалога в любом месте.

Ответ 2

Вам необходимо импортировать этот модуль в файл модуля (по умолчанию app.module.ts):

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

и добавьте MatDialogModule для imports в объявлении модуля:

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

}

Ответ 3

Проблема заключается в том, что вы включаете свой <dialog-component></dialog-component> в свой код где-нибудь, а также вставляете его в свое представление с помощью @Inject. Если вы удалите свой <dialog-component></dialog-component> из любого шаблона.html, который у вас есть, он будет работать!

Ответ 4

Удалите MatDialogRef из компонента DialogOverviewExample. Вам это не нужно. Тогда он должен работать.

Ответ 5

Обновление сентября 2019 года

Многие из примеров angular материалов показывают импорт 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

Эта ошибка также возникает, если angular материал 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 { }