9
votes

La boîte de dialogue MatDialog du matériau angulaire ne se ferme pas

Je travaille sur une application Angular 6 dans laquelle j'utilise la boîte de dialogue Matériau angulaire

  • J'essaie de fermer la boîte de dialogue en cas de succès une fois mes données envoyées avec succès au serveur,

J'ai utilisé this.dialogRef.close (0); ou this.dialogRef.close (0); ou this.dialogRef.close (); mais ça ne marche toujours pas

Je mets mon code ci-dessous

component1.ts

    import { Component, OnInit , Inject } from '@angular/core';
    import {  MatDialog  , MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';


   ... .. 
   .. .. 

      constructor( private restapi: ServicesService , private dialog: MatDialog ,   public dialogRef: MatDialogRef<NewRegistrationComponent>,
        @Inject(MAT_DIALOG_DATA) public data: any ) {

   ...
   ..... 
   }


     user_signup(data) {


          let userData = {Email: this.email };
          this.restapi.signupUsingSocial(userData).then(
            result => {
              this.responseData = result;

              if (this.responseData.status == 1) {
                localStorage.setItem('token', this.responseData.data);
                this.dialogRef.close(1);

              } else {
                alert('give proper input');
              }
            },
            err => {
              this.dialogRef.close(0);
            }
          );}}

component2.ts

let NewRegDialog = this.dialog.open(NewRegistrationComponent, {

  width: '750px',
  height: '500px',
  //disableClose: true,
  data: {
    email : email,
    regType : regType,
  },
});

NewRegDialog.afterClosed().subscribe(result => {

  if(result == 1){
    this.dialogRef.close('signup');
  }else{
    alert('Login failed') ;
    });


2 commentaires

Pouvez-vous être plus précis sur le dialogue que vous essayez de fermer? comme je le vois dans votre code, il pourrait y avoir 2 dialogues un dans le composant 2 et un dans le composant 1 comme vous l'avez fait NewRegDialog.afterClosed().subscribe(result => { if(result == 1){ this.dialogRef.close('signup'); }else{ alert('Login failed') ; }); où est this.dialogRef.close('signup'); situé? votre code devrait fonctionner correctement sur le component2 et le dialogue devrait se fermer.


Les codes semblent corrects. Quelle erreur obtenez vous? Si vous créez une démo stackblitz, il serait plus facile d'obtenir de l'aide.


4 Réponses :


-1
votes

Vous pouvez fermer la boîte de dialogue du composant où vous avez

let NewRegDialog = this.dialog.open(NewRegistrationComponent, {

Dans votre exemple, component1 a la méthode dialog.open. Pourquoi essayez-vous de fermer dans component2?


0 commentaires

0
votes

Tu peux essayer :

close(){
   this.dialogRef.close(true);
}

et dans vos ts:

 <div mat-dialog-actions>
    <button (click)="close()">close</button>
 </div>


3 commentaires

C'est this.dialog.closeAll() pas this.dialogRef.close(true); . Voir la documentation de l'API: material.angular.io/components/dialog/api


@ThomasDavidKehoe Cela dépend de ce que le bouton est censé faire, n'est-ce pas? this.dialog.closeAll() fermera toutes les boîtes de dialogue et this.dialogRef.close() fermera que spécifique dialogRef . Certes, je ne vois pas vraiment ce que ce bouton de fermeture a à voir avec la question d'OP, car ils essaient de le fermer par programme.


Vous avez raison, MatDialogRef a une méthode close (), MatDialog a une méthode closeAll (). Je les ai confus.



17
votes

Vous rencontrez cette erreur car vous ouvrez la boîte de dialogue en dehors de NgZone.

Une solution simple consiste à importer la NgZone dans le constuctor:

constructor(public dialogRef: MatDialogRef<ModalComponent>, private ngZone: NgZone) { }

puis exécutez le code dans NgZone

onNoClick(): void {
this.ngZone.run(() => {
  this.dialogRef.close();
});

}

cet article explique ce qu'est une NgZone: https://blog.oughttram.io/angular/2016/02/01/zones-in-angular-2.html


0 commentaires

0
votes

J'ai passé de nombreuses heures là-dedans et ce que j'ai compris, c'est que dans ma fenêtre contextuelle, j'avais un formulaire qui déclenchait une erreur dans le javascript sur la console Chrome. Lorsque j'ai résolu cette erreur de formulaire, ma fenêtre contextuelle a pu se fermer. Ma suggestion pour vous de résoudre cette erreur est que vous pouvez essayer de remplacer le contenu de votre modal par un contenu de base pour tester la fonctionnalité du bouton de fermeture.

Allez sur https://material.angular.io/components/dialog/examples puis sélectionnez l'onglet exemples puis vérifiez le code du premier échantillon dans le bouton <>. Remplacez ensuite le contenu de votre popup par celui de dialog-content-example-dialog.html

Le devrait être résolu maintenant, j'espère que cela fonctionne pour votre

Cordialement,

Juan


0 commentaires