165 votes

Désactiver le clic en dehors de la zone de dialogue de matériel angulaire pour fermer la boîte de dialogue (avec Angular Version 4.0+)

Je travaille actuellement sur la page de réinitialisation du mot de passe d'un projet Angular 4. Nous utilisons Angular Material pour créer la boîte de dialogue, cependant, lorsque le client clique en dehors de la boîte de dialogue, elle se ferme automatiquement. Existe-t-il un moyen d'éviter la fermeture de la boîte de dialogue jusqu'à ce que notre code appelle la fonction "fermer"? Ou comment devrais-je créer une boîte de dialogue non fermable?

396voto

Edric Points 8033

Il y a deux façons de le faire.

  1. Dans la méthode qui ouvre la boîte de dialogue, passez l'option de configuration suivante disableClose en tant que deuxième paramètre dans MatDialog#open() et définissez-la sur true:

    export class AppComponent {
      constructor(private dialog: MatDialog){}
      openDialog() {
        this.dialog.open(DialogComponent, { disableClose: true });
      }
    }
  2. Alternativement, faites-le dans le composant de la boîte de dialogue lui-même.

    export class DialogComponent {
      constructor(private dialogRef: MatDialogRef){
        dialogRef.disableClose = true;
      }
    }

Voici ce que vous recherchez:

<code>disableClose</code> propriété dans material.angular.io

Et voici une démonstration Stackblitz


Autres cas d'utilisation

Voici quelques autres cas d'utilisation et extraits de code pour les implémenter.

Permettre à esc de fermer la boîte de dialogue mais interdire de cliquer sur le fond pour la fermer

Comme l'a dit @MarcBrazeau dans le commentaire en dessous de ma réponse, vous pouvez permettre à la touche esc de fermer la boîte de dialogue mais toujours interdire de cliquer en dehors de la boîte. Utilisez ce code dans le composant de votre boîte de dialogue:

import { Component, OnInit, HostListener } from '@angular/core';
import { MatDialogRef } from '@angular/material';
@Component({
  selector: 'app-third-dialog',
  templateUrl: './third-dialog.component.html'
})
export class ThirdDialogComponent {
  constructor(private dialogRef: MatDialogRef) {      
}
  @HostListener('window:keyup.esc') onKeyUp() {
    this.dialogRef.close();
  }

}

Empêcher esc de fermer la boîte de dialogue mais autoriser de cliquer sur le fond pour la fermer

P.S. Ceci est une réponse qui provient de cette réponse, où la démo était basée sur cette réponse.

Pour empêcher la touche esc de fermer la boîte de dialogue mais permettre de cliquer sur le fond pour la fermer, j'ai adapté la réponse de Marc, ainsi qu'utilisé MatDialogRef#backdropClick pour écouter les événements de clic sur le fond.

Initialement, la boîte de dialogue aura l'option de configuration disableClose définie sur true. Cela garantit que la touche esc, ainsi que le clic sur le fond, ne fermera pas la boîte de dialogue.

Ensuite, abonnez-vous à la méthode MatDialogRef#backdropClick (qui émet un événement lorsque le fond est cliqué et le renvoie en tant que MouseEvent).

Quoi qu'il en soit, assez de jargon technique. Voici le code:

openDialog() {
  let dialogRef = this.dialog.open(DialogComponent, { disableClose: true });
  /*
     Abonnez-vous aux événements émis lorsque le fond est cliqué
     REMARQUE: Comme nous n'utiliserons pas réellement l'événement `MouseEvent`, nous utiliserons simplement un trait de soulignement ici
     Voir https://stackoverflow.com/a/41086381 pour plus d'informations
  */
  dialogRef.backdropClick().subscribe(() => {
    // Fermer la boîte de dialogue
    dialogRef.close();
  })

  // ...
}

Alternativement, cela peut être fait dans le composant de la boîte de dialogue:

export class DialogComponent {
  constructor(private dialogRef: MatDialogRef) {
    dialogRef.disableClose = true;
    /*
      Abonnez-vous aux événements émis lorsque le fond est cliqué
      REMARQUE: Comme nous n'utiliserons pas réellement l'événement `MouseEvent`, nous utiliserons simplement un trait de soulignement ici
      Voir https://stackoverflow.com/a/41086381 pour plus d'informations
    */
    dialogRef.backdropClick().subscribe(() => {
      // Fermer la boîte de dialogue
      dialogRef.close();
    })
  }
}

5 votes

Je trouve ennuyeux que vous deviez désactiver à la fois "escape et en cliquant à l'extérieur". Pour contourner cela: @HostListener('window:keyup.esc') onKeyUp() { this.dialogRef.close(); }

0 votes

@MarcBrazeau J'ai ajouté votre commentaire à ma réponse.

1 votes

Un avertissement pour les personnes utilisant des champs de saisie avec l'autocomplétion. Utiliser HostListener ferme la boîte de dialogue lorsque vous fermez la liste de saisie automatique.

5voto

Seva Points 1322

Que diriez-vous de jouer avec ces deux propriétés?

disableClose: boolean - Indique si l'utilisateur peut fermer la fenêtre modale en appuyant sur la touche Echap ou en cliquant sur le fond.

hasBackdrop: boolean - Indique si la boîte de dialogue a un fond.

https://material.angular.io/components/dialog/api

0 votes

Définir hasBackdrop sur false supprime le noircissement de la zone à l'extérieur de la boîte de dialogue

0 votes

A travaillé avec Angular 9. 'hasBackdrop' ne permet pas à l'utilisateur d'interagir avec d'autres éléments extérieurs. disableClose n'autorise pas l'utilisateur à fermer la boîte de dialogue avec un clic extérieur ou une touche d'échappement.

1voto

Ajouter

[config]="{arrière-plan : 'statique'}"

au code du modal.

0voto

Akitha_MJ Points 372

Cela fonctionne pour moi

  openDialog() {
    this.dialog.open(VotreComposant, { disableClose: true });
  }

-2voto

Abdel Points 1708

RTFM

Selon la documentation ici, vous pouvez utiliser l'entrée disableClose pour empêcher l'utilisateur de fermer la boîte de dialogue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X