Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No provider for MatDialogRef

I am using material 2 version 2.0.0-beta.12. I need to adjust the position of the material Modal. I followed this answer to do that. https://stackoverflow.com/a/44238699/8253445 Since MdDialog is not available now I used {MatDialog, MatDialogRef, MAT_DIALOG_DATA}.

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

When I add MatDialogRef to my constructor it gives me the error:

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>
like image 675
kashif roshen Avatar asked Oct 11 '17 10:10

kashif roshen


2 Answers

You will get that exact

No provider for MatDialogRef

error in case you include your dialog's component html selector in dialog-overview-example.html like <dialog-overview-example-dialog></dialog-overview-example-dialog>

There is no need for that, do not include the html selector of the dialog component anywhere.

like image 78
Javier Aviles Avatar answered Oct 08 '22 15:10

Javier Aviles


You need to import this module in your module file (app.module.ts by default):

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

and add MatDialogModule to imports in your module declaration:

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

EDIT:

You need to pass data through this.dialogRef.close(); to get result in subscribe working. For example:

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

}
like image 33
Piotr Pliszko Avatar answered Oct 08 '22 16:10

Piotr Pliszko