ngx-bootstrap modal: comment obtenir une valeur de retour d'un modal?

dans mon application Angular 4, supposons que je suis dans un service.

a un moment donné je veux demander à l'utilisateur pour une confirmation, actuellement je le fais avec juste un confirm(...) demande:

const result = confirm('Are you sure?');

si, à la place je voudrais afficher un ngx-bootstrap modal avec, disons, deux boutons "Oui" ou "Non" et d'obtenir un résultat similaire?


EDIT: dans mon cas, j'ai résolu mon problème en jouant avec Sujet. Ici vous pouvez trouver ma solution, au cas où elle pourrait être utile à quelqu'un d'autre. Cependant cette solution ne résout pas question qui consiste à renvoyer une valeur d'un modal, donc je la laisse ouverte.

13
demandé sur Shin 2017-09-25 18:02:53

4 réponses

Essayez comme ceci :

myexample elle fonctionne correctement. espérons que cela vous aidera

à la maison.module.ts

import { ModalModule } from 'ngx-bootstrap';

@NgModule({
    imports: [
        ModalModule.forRoot()
    ]
})

à la maison.composant.html

<button class="btn btn-primary" (click)="openConfirmDialog()">Open Confirm box</button>

à la maison.composant.ts

import { BsModalService } from 'ngx-bootstrap/modal';
import { BsModalRef } from 'ngx-bootstrap/modal/modal-options.class';

export class HomeComponent {
    public modalRef: BsModalRef;
    constructor(
        private homeService: HomeService,
        private modalService: BsModalService
    ) { }

    openConfirmDialog() {
        this.modalRef = this.modalService.show(HomeModalComponent);
        this.modalRef.content.onClose.subscribe(result => {
            console.log('results', result);
        })
    }
}

accueil-modale.composant.html

<div class="alert-box">
    <div class="modal-header">
        <h4 class="modal-title">Confirm</h4>
        <button type="button" class="close" aria-label="Close" (click)="bsModalRef.hide()">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    <div class="modal-body">
        Are you sure want to delete this node?
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-secondary" (click)="onConfirm()">Yes</button>
        <button type="button" class="btn btn-secondary" (click)="onCancel()">No</button>        
    </div>
</div>

accueil-modale.composant.ts

import { Subject } from 'rxjs/Subject';
import { BsModalRef } from 'ngx-bootstrap/modal';

export class HomeModalComponent {

    public onClose: Subject<boolean>;

    constructor(private _bsModalRef: BsModalRef) {

    }

    public ngOnInit(): void {
        this.onClose = new Subject();
    }

    public onConfirm(): void {
        this.onClose.next(true);
        this._bsModalRef.hide();
    }

    public onCancel(): void {
        this.onClose.next(false);
        this._bsModalRef.hide();
    }
}
36
répondu Chandru 2017-09-25 17:32:45

j'ai utilisé la solution de @Chandru, cependant retourtrue ou false, au lieu de:

openConfirmDialog() {
    this.modalRef = this.modalService.show(HomeModalComponent);
    this.modalRef.content.onClose.subscribe(result => {
        console.log('results', result);
    })
}

j'ai simplement utilisé:

openConfirmDialog() {
    this.modalRef = this.modalService.show(HomeModalComponent);
    return this.modalRef.content.onClose;
}
3
répondu Chris Halcrow 2018-05-21 23:20:12

@ShinDarth vous pouvez ajouter cette fonction dans votre service et appeler ce funcion chaque fois que nécessaire.

a votre Service, Créez cette fonction

    openConfirmDialogBox() {
        this.modalRef = this.modalService.show(DemoModalComponent);
        this.modalRef.content.action.take(1)
            .subscribe((value) => {
                console.log(value) // here value passed on clicking ok will be printed in console. Here true will be printed if OK is clicked
                return value;
             }, (err) => {
                 return false;
        });
    }

Dans votre démo-modale.composant.ts, créer un EventEmitter

 @Output() action = new EventEmitter();
 public onClickOK() {
    this.action.emit(true); //Can send your required data here instead of true
 }
 public onClickCANCEL() {
    this.action.emit(false); //Can send your required data here instead of true
 }

j'espère que cela vous aidera

0
répondu khush 2018-05-24 07:13:53

je comprends que la plupart des réponses ci-dessus sont tout à fait valides, mais que le but principal est de pouvoir invoquer le dialogue de confirmation de cette façon...

  async openModalConfirmation() {
    const result = await this.confirmationSvc.confirm('Confirm this...');
    if (result) {
      console.log('Yes!');
    } else {
      console.log('Oh no...');
    }
  }

a Noter que c'est principalement sucre syntaxique pour simplifier l'utilisation d'une promesse et asynchrone des trucs.

je pense que c'est ce que l'OP cherchait et peut probablement être retravaillé pour supporter le retour de n'importe quel autre type de données (à l'exception d'un booléen).

Le reste du code ci-dessous (non compris le modèle de garder ce court), assez simple..

ModalConfirmationService

import { ModalConfirmationComponent } from './component';

@Injectable()
export class ModalConfirmationService {

  constructor(private bsModalService: BsModalService) {}

  confirm(message: string): Promise<boolean> {
    const modal = this.bsModalService.show(ModalConfirmationComponent, { initialState: { message: message }});

    return new Promise<boolean>((resolve, reject) => modal.content.result.subscribe((result) => resolve(result) ));
  }
}

ModalConfirmationComponent

import { Component, Input, Output, EventEmitter} from '@angular/core';
import { BsModalRef } from 'ngx-bootstrap/modal/bs-modal-ref.service';
import { Subject } from 'rxjs/Subject';

@Component({
  templateUrl: './component.html'
})
export class ModalConfirmationComponent {
  @Input() message: string;
  result: Subject<boolean> = new Subject<boolean>();

  constructor(public modalRef: BsModalRef) { }

  confirm(): void {
    this.result.next(true);
    this.modalRef.hide();
  }

  decline(): void {
    this.result.next(false);
    this.modalRef.hide();
  }
}
0
répondu agascon 2018-05-24 10:41:32