109 votes

Un moyen simple de créer une boîte de dialogue de confirmation en Angular ?

Existe-t-il un moyen simple de créer une boîte de dialogue de confirmation en angular 2 ? L'idée est de cliquer sur un élément et d'afficher une fenêtre contextuelle ou une modale pour confirmer sa suppression. angulaire2-modale mais je ne sais pas comment faire pour que si vous confirmez ou annulez, cela fasse quelque chose. la fonction de clic fonctionne bien, le seul problème est que je ne sais pas trop comment l'utiliser. J'ai aussi une autre modale avec le même plugin avec la différence que j'utilise.

this.modal.open(MyComponent);

Et je ne veux pas créer un autre composant juste pour afficher une boîte de confirmation, c'est pourquoi je demande.

1 votes

"Le moyen le plus simple serait d'utiliser quelque chose comme angular2-modal comme vous l'avez mentionné. Sinon, vous devrez en construire un vous-même, et je n'appellerais pas cela un moyen facile. Avez-vous vu sur le lien que vous avez fourni qu'il y avait des exemples de plunker montrant l'utilisation :) embed.plnkr.co/mbPzd8

0 votes

Je vois, alors ce sera une bonne idée de créer un composant avec la popup de confirmation qui a 2 boutons et quand on clique dessus, il exécute une fonction dans le composant principal. Dans l'exemple, il utilise la touche 5 pour fermer la boîte de dialogue, je dois la fermer et appeler une fonction. Quoi qu'il en soit, je vais essayer d'être aussi simple et clair que possible et je posterai les résultats.

0 votes

Il existe également d'autres modales, qui peuvent avoir d'autres fonctions intégrées que vous pourriez souhaiter, mais vos exigences ne semblent pas trop difficiles, donc je suppose que beaucoup d'entre elles vous conviendraient, mais si vous le souhaitez, naviguez et trouvez celle qui vous convient. Voici quelques exemples : npmjs.com/search?q=angular+2+modal Essayez-les et revenez vers SO si vous rencontrez des problèmes ! Bon codage ! :)

243voto

Philip John Points 1638

Méthode 1

Une façon simple de confirmer est d'utiliser l'alerte de confirmation native du navigateur. Le modèle peut comporter un bouton ou un lien.

<button type=button class="btn btn-primary"  (click)="clickMethod('name')">Delete me</button>

Et la méthode du composant peut être quelque chose comme ci-dessous.

clickMethod(name: string) {
  if(confirm("Are you sure to delete "+name)) {
    console.log("Implement delete functionality here");
  }
}

Méthode 2

Une autre façon d'obtenir une boîte de dialogue de confirmation simple est d'utiliser les composants bootstrap angulaires tels que ng-bootstrap ou ngx-bootstrap . Vous pouvez simplement installer le composant et utiliser le composant modal.

  1. Exemples de modales utilisant ng-bootstrap
  2. Exemples de modales utilisant ngx-bootstrap .

Méthode 3

Vous trouverez ci-dessous une autre façon de mettre en œuvre un simple popup de confirmation en utilisant angular2/material que j'ai mis en œuvre dans mon projet.

app.module.ts

import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { ConfirmationDialog } from './confirm-dialog/confirmation-dialog';

@NgModule({
  imports: [
    ...
    FormsModule,
    ReactiveFormsModule
  ],
  declarations: [
    ...
    ConfirmationDialog
  ],
  providers: [ ... ],
  bootstrap: [ AppComponent ],
  entryComponents: [ConfirmationDialog]
})
export class AppModule { }

dialogue de confirmation.ts

import { Component, Input } from '@angular/core';
import { MdDialog, MdDialogRef } from '@angular/material';

@Component({
  selector: 'confirm-dialog',
  templateUrl: '/app/confirm-dialog/confirmation-dialog.html',
})
export class ConfirmationDialog {
  constructor(public dialogRef: MdDialogRef<ConfirmationDialog>) {}

  public confirmMessage:string;
}

dialogue-de-confirmation.html

<h1 md-dialog-title>Confirm</h1>
<div md-dialog-content>{{confirmMessage}}</div>
<div md-dialog-actions>
  <button md-button style="color: #fff;background-color: #153961;" (click)="dialogRef.close(true)">Confirm</button>
  <button md-button (click)="dialogRef.close(false)">Cancel</button>
</div>

app.component.html

<button (click)="openConfirmationDialog()">Delete me</button>

app.component.ts

import { MdDialog, MdDialogRef } from '@angular/material';
import { ConfirmationDialog } from './confirm-dialog/confirmation-dialog';

@Component({
  moduleId: module.id,
  templateUrl: '/app/app.component.html',
  styleUrls: ['/app/main.css']
})

export class AppComponent implements AfterViewInit {
  dialogRef: MdDialogRef<ConfirmationDialog>;

  constructor(public dialog: MdDialog) {}

  openConfirmationDialog() {
    this.dialogRef = this.dialog.open(ConfirmationDialog, {
      disableClose: false
    });
    this.dialogRef.componentInstance.confirmMessage = "Are you sure you want to delete?"

    this.dialogRef.afterClosed().subscribe(result => {
      if(result) {
        // do confirmation actions
      }
      this.dialogRef = null;
    });
  }
}

index.html => ajout de la feuille de style suivante

<link rel="stylesheet" href="node_modules/@angular/material/core/theming/prebuilt/indigo-pink.css">

0 votes

Et où se trouve MdDialogRef définis et comment dialogRef est attribué dans AppComponent ?

0 votes

@RezaRahmati Comme vous pouvez le voir dans app.component.ts, MdDialogRef est défini dans le module node @angular/material et dialogRef est assigné dans la méthode openConfirmationDialog()

1 votes

J'ai aussi dû importer BrowserAnimationsModule de @angular/platform-browser/animations et MatériauModule de @angular/material

44voto

Tarek Badr Points 231

Vous pouvez utiliser window.confirm à l'intérieur de votre fonction combinée avec la condition if.

 delete(whatever:any){
    if(window.confirm('Are sure you want to delete this item ?')){
    //put your delete method logic here
   }
}

lorsque vous appelez la méthode de suppression, un message de confirmation s'affiche et lorsque vous appuyez sur ok, la logique de la condition if est exécutée.

1 votes

Vous n'êtes pas obligé d'utiliser le mot-clé "fenêtre".

23voto

tilo Points 6098

J'arrive un peu tard dans la soirée, mais voici une autre implémentation utilisant ng-bootstrap : https://stackblitz.com/edit/angular-confirmation-dialog

dialogue de confirmation.service.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';

import { NgbModal } from '@ng-bootstrap/ng-bootstrap';

import { ConfirmationDialogComponent } from './confirmation-dialog.component';

@Injectable()
export class ConfirmationDialogService {

  constructor(private modalService: NgbModal) { }

  public confirm(
    title: string,
    message: string,
    btnOkText: string = 'OK',
    btnCancelText: string = 'Cancel',
    dialogSize: 'sm'|'lg' = 'sm'): Promise<boolean> {
    const modalRef = this.modalService.open(ConfirmationDialogComponent, { size: dialogSize });
    modalRef.componentInstance.title = title;
    modalRef.componentInstance.message = message;
    modalRef.componentInstance.btnOkText = btnOkText;
    modalRef.componentInstance.btnCancelText = btnCancelText;

    return modalRef.result;
  }

}

confirmation-dialog.component.ts

import { Component, Input, OnInit } from '@angular/core';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';

@Component({
  selector: 'app-confirmation-dialog',
  templateUrl: './confirmation-dialog.component.html',
  styleUrls: ['./confirmation-dialog.component.scss'],
})
export class ConfirmationDialogComponent implements OnInit {

  @Input() title: string;
  @Input() message: string;
  @Input() btnOkText: string;
  @Input() btnCancelText: string;

  constructor(private activeModal: NgbActiveModal) { }

  ngOnInit() {
  }

  public decline() {
    this.activeModal.close(false);
  }

  public accept() {
    this.activeModal.close(true);
  }

  public dismiss() {
    this.activeModal.dismiss();
  }

}

dialogue-de-confirmation.composant.html

<div class="modal-header">
  <h4 class="modal-title">{{ title }}</h4>
    <button type="button" class="close" aria-label="Close" (click)="dismiss()">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
  <div class="modal-body">
    {{ message }}
  </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-danger" (click)="decline()">{{ btnCancelText }}</button>
    <button type="button" class="btn btn-primary" (click)="accept()">{{ btnOkText }}</button>
  </div>

Utilisez le dialogue comme ceci :

public openConfirmationDialog() {
    this.confirmationDialogService.confirm('Please confirm..', 'Do you really want to ... ?')
    .then((confirmed) => console.log('User confirmed:', confirmed))
    .catch(() => console.log('User dismissed the dialog (e.g., by using ESC, clicking the cross icon, or clicking outside the dialog)'));
  }

0 votes

J'ai suivi le code ci-dessus mais lorsque je clique sur le bouton, la fenêtre modale apparaît pendant une fraction de seconde et disparaît immédiatement. Pouvez-vous m'aider à résoudre ce problème ?

0 votes

Cela se produit-il également avec la démo StackBlitz liée ?

0 votes

Dans StackBlitz, cela fonctionne bien. J'ai copié tous ces fichiers dans mon modèle de projet, où je suis confronté à ce problème.

18voto

Sudeep Rane Points 141

UPDATE : Plunkr a ajouté

J'ai cherché une solution sur tous les forums mais je n'en ai trouvé aucune, alors j'ai trouvé une solution avec la fonction Callback Javascript de la vieille école. Il s'agit d'une manière vraiment simple et propre de créer un dialogue de confirmation et de définir des fonctions Callback pour les deux éléments suivants OUI et NON les événements de clics.
J'ai utilisé Bootstrap CSS pour la modale et un service d'alerte avec rxjs Subject.

alert.component.html

        <div *ngIf="message.type == 'confirm'"  class="modal-body">
            <div class="row">
                <div class="col-md-12">
                    <h3 class="text-center">{{message.text}}</h3>
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    <p class="text-center">
                        <a (click)="message.noFn()">
                            <button class="btn btn-pm">No</button>
                        </a>
                        <a (click)="message.siFn()">
                            <button  class="btn btn-sc" >Yes</button>
                        </a>
                    </p>
                </div>
            </div>
         </div>

alert.component.ts

export class AlertComponent {
    message: any;
    constructor(
      public router: Router, 
      private route: ActivatedRoute, 
      private alertService: AlertService,
   ) { }
   ngOnInit() {
    //this function waits for a message from alert service, it gets 
    //triggered when we call this from any other component
    this.alertService.getMessage().subscribe(message => {
        this.message = message;
    });
}

La partie la plus importante est ici alert.service.ts

     import { Injectable } from '@angular/core'; 
     import { Router, NavigationStart } from '@angular/router'; 
     import { Observable } from 'rxjs'; 
     import { Subject } from 'rxjs/Subject';
     @Injectable() export class AlertService {
          private subject = new Subject<any>();
          constructor(){}
          confirm(message: string,siFn:()=>void,noFn:()=>void){
            this.setConfirmation(message,siFn,noFn);
          }
          setConfirmation(message: string,siFn:()=>void,noFn:()=>void) {
            let that = this;
            this.subject.next({ type: "confirm",
                        text: message,
                        siFn:
                        function(){
                            that.subject.next(); //this will close the modal
                            siFn();
                        },
                        noFn:function(){
                            that.subject.next();
                            noFn();
                        }
                     });

                 }

          getMessage(): Observable<any> {
             return this.subject.asObservable();
          }
       }

Appelez la fonction à partir de n'importe quel composant

this.alertService.confirm("You sure Bro?",function(){
    //ACTION: Do this If user says YES
},function(){
    //ACTION: Do this if user says NO
})

Plunkr https://embed.plnkr.co/vWBT2nWmtsXff0MXMKdd/

0 votes

Bonjour, je cherche quelque chose comme ça, mais le code ci-dessus ne fonctionne pas pour moi, pas de modale affichée et pas d'erreur dans la console.

1 votes

Bonjour Mrpi, Pouvez-vous vous assurer que vous avez bien mis en place les css de Bootstrap ? Maintenant, si vous voulez tester l'aspect de votre modale, supprimez ng-if et vérifiez.

0 votes

Cela fonctionne. Merci. Qu'en est-il du positionnement vertical au centre ?

6voto

Chris Hodges Points 366

Voici une approche radicalement différente qui utilise la fonctionnalité de confirmation native de javascript et une directive Angular personnalisée. C'est super flexible et assez léger :

Utilisation :

<button (hrsAreYouSure) (then)="confirm(arg1)" (else)="cancel(arg2)">
  This will execute confirm if user presses Ok on the confirmation dialog, or cancel if they
  hit Cancel
</button>

Directive :

import {Directive, ElementRef, EventEmitter, Inject, OnInit, Output} from '@angular/core';

@Directive({
  selector: '[hrsAreYouSure]'
})

export class AreYouSureDirective implements OnInit {

  @Output() then = new EventEmitter<boolean>();
  @Output() else = new EventEmitter<boolean>();

  constructor(@Inject(ElementRef) private element: ElementRef) { }

  ngOnInit(): void {
    const directive = this;
    this.element.nativeElement.onclick = function() {
      const result = confirm('Are you sure?');
      if (result) {
        directive.then.emit(true);
      } else {
        directive.else.emit(true);
      }
    };
  }
}

0 votes

Chrome m'a demandé de supprimer les parenthèses autour de hrsAreYouSure dans le bouton, sinon cela ne fonctionnerait pas.

0 votes

De même, si vous appuyez sur la touche "Entrée" pendant que la boîte de dialogue s'affiche, vous la confirmez, que ce soit votre intention ou non.

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