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

je travaille actuellement sur la page de réinitialisation de mot de passe D'un projet Angular 4. Nous utilisons un matériau angulaire pour créer la boîte de dialogue, cependant, lorsque le client clique hors de la boîte de dialogue, il se ferme automatiquement. Y a-t-il un moyen d'éviter le dialogue Fermer jusqu'à ce que notre côté code appelle la fonction "fermer"? Ou comment créer un modal inclassable?

21
demandé sur Edric 2017-10-16 17:35:41

2 réponses

Il y a deux façons de le faire.

  1. dans la méthode qui ouvre la boîte de dialogue, passez dans l'option de configuration suivante disableClose comme second paramètre de MatDialog#open() et réglez true:

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

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

voici ce que vous cherchez:

<codedisableClose</code property in material.angular.io

Et voici un démonstration de Stackblitz


Autres cas d'utilisation

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

Autoriser esc pour fermer la boîte de dialogue mais ne pas cliquer sur la toile de fond pour fermer la boîte de dialogue

comme l'a dit @MarcBrazeau dans le commentaire ci-dessous ma réponse, vous pouvez permettre le esc touche pour fermer le modal mais toujours interdire le clic en dehors du modal. L'utilisation de ce code sur votre boîte de dialogue composant:

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<ThirdDialogComponent>) {      
}
  @HostListener('window:keyup.esc') onKeyUp() {
    this.dialogRef.close();
  }

}

Prévenir esc fermer la boîte de dialogue, mais de permettre cliquant sur la toile de fond pour fermer

P. S Cette réponse provient de cette réponse, où la démo était basée sur cette réponse.

pour empêcher le esc touche de la fermeture de la boîte de dialogue mais permet de cliquer sur la toile de fond pour fermer, J'ai adapté la réponse de Marc, ainsi comme à l'aide de MatDialogRef#backdropClick pour écouter les événements click pour la toile de fond.

initialement, la boîte de dialogue aura l'option de configuration disableClose comme true. Cela garantit que le esc keypress, ainsi que le fait de cliquer sur la toile de fond ne provoquera pas la fermeture de la boîte de dialogue.

après, abonnez-vous au MatDialogRef#backdropClick méthode (qui émet quand la toile de fond est cliquée et retourne comme un MouseEvent).

de toute façon, assez parlé technique. Voici l' code:

openDialog() {
  let dialogRef = this.dialog.open(DialogComponent, { disableClose: true });
  /*
     Subscribe to events emitted when the backdrop is clicked
     NOTE: Since we won't actually be using the `MouseEvent` event, we'll just use an underscore here
     See https://stackoverflow.com/a/41086381 for more info
  */
  dialogRef.backdropClick().subscribe(_ => {
    // Close the dialog
    dialogRef.close();
  })

  // ...
}

alternativement, cela peut être fait dans le composant de dialogue:

export class DialogComponent {
  constructor(private dialogRef: MatDialogRef<DialogComponent>) {
    dialogRef.disableClose = true;
    /*
      Subscribe to events emitted when the backdrop is clicked
      NOTE: Since we won't actually be using the `MouseEvent` event, we'll just use an underscore here
      See https://stackoverflow.com/a/41086381 for more info
    */
    dialogRef.backdropClick().subscribe(_ => {
      // Close the dialog
      dialogRef.close();
    })
  }
}
62
répondu Edric 2018-06-25 16:32:16

RTFM

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

1
répondu Abdel 2017-10-16 14:46:20