Нет провайдера для 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 { }