J'utilise matériel 2 version 2.0.0-beta.12. Je dois ajuster la position du matériau Modal. J'ai suivi cette réponse pour le faire. https://stackoverflow.com/a/44238699/8253445 Comme MdDialog n'est plus disponible, j'ai utilisé {MatDialog, MatDialogRef, MAT_DIALOG_DATA}.
constructor(public dialog: MatDialog,public dialModRef:MatDialogRef<any>) {}
Lorsque j'ajoute MatDialogRef à mon constructeur, l'erreur "Aucun fournisseur pour MatDialogRef" est générée. S'il vous plaît pouvez-vous m'aider à comprendre cela?
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>
Vous obtiendrez cela exactement
Aucun fournisseur pour
MatDialogRef
erreur si vous incluez le sélecteur html de votre boîte de dialogue dans dialog-overview-example.html
comme <dialog-overview-example-dialog></dialog-overview-example-dialog>
Cela n’est pas nécessaire, n’incluez nulle part le sélecteur HTML du composant de dialogue.
Vous devez importer ce module dans votre fichier de module (app.module.ts
Par défaut):
import { MatDialogModule } from '@angular/material';
et ajoutez MatDialogModule
à imports
dans votre déclaration de module:
@NgModule({
declarations: [...],
imports: [
...
MatDialogModule,
...
],
providers: [...],
entryComponents: [...],
bootstrap: [...]
})
EDIT:
Vous devez transmettre des données via this.dialogRef.close();
pour que result
dans subscribe
fonctionne. Par exemple:
@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);
}
}
Le problème est que vous incluez votre <dialog-component></dialog-component>
dans votre code quelque part ainsi que l’injecter dans votre vue avec @Inject. Si vous retirez votre <dialog-component></dialog-component>
de quel que soit le fichier template.html dans lequel vous l’avez trouvé, cela fonctionnera!
Supprimez MatDialogRef du composant DialogOverviewExample. Vous n'en avez pas besoin ici. Cela devrait fonctionner alors.
La plupart des exemples de matériaux angulaires affichent le MatDialogRef
importé sous:
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
Cela provoquera l'erreur suivante (par exemple, lors de la création d'un service pour encapsuler la création de composants de boîte de dialogue):
ERROR NullInjectorError: StaticInjectorError(AppModule)[DialogComponent -> MatDialogRef]:
StaticInjectorError(Platform: core)[DialogWarningComponent -> MatDialogRef]:
NullInjectorError: No provider for MatDialogRef!
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';
Cette erreur se produira également si Angular Material module
utilise l’import from '@angular/material/dialog'
. Recommandez de structurer le module Matériau comme suit:
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 { }