/ / Gestire due osservabili in canDeactivate - angular, dattiloscritto, osservabile

Gestire due osservabili in canDeactivate - angular, dattiloscritto, osservabile

Nel mio percorso di protezione canDeactivate (), sto chiamando amodale che ha due pulsanti: ok e cancella. Voglio ritornare true se il pulsante ok viene cliccato in modo che l'utente possa continuare a lasciare la pagina e restituire false se viene cliccato il pulsante Annulla. Ecco il mio codice attuale:

canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> {
let can =  component.canDeactivate();
//let result = new Observable<boolean>();
let okResult = new Observable<boolean>();
let cancelResult = new Observable<boolean>();

if (!can) {
component.myChangesModal.show("Warning", "You are about to leave this page with unsaved changes.");

okResult = component.myChangesModal.okEvent.map(() => true);
//okResult.subscribe();

cancelResult = component.myChangesModal.cancelEvent.map(() => false);
//cancelResult.subscribe();
console.log(okResult);
console.log(cancelResult);

const observablesArray = [okResult, cancelResult];

let result = Observable.combineLatest.apply(this, observablesArray).take(1);
result.subscribe();

return result;
}
return true;
}

Inizialmente, quando ho provato questo, avevo solo unsingolo osservabile per controllare quando viene chiamato il pulsante ok, e quindi si iscriverà a questo e restituirà il risultato. Questo ha funzionato, tuttavia ha funzionato solo per un pulsante e ogni volta che si fa clic sul pulsante Annulla questo ha rotto tutto. Ecco ciò che inizialmente avevo funzionato perfettamente per un solo pulsante.

canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> {
let can =  component.canDeactivate();
let result = new Observable<boolean>();

if (!can) {
component.myChangesModal.show("Warning", "You are about to leave this page with unsaved changes.");

result = component.myChangesModal.okEvent.map(() => true);
result.subscribe();

return result;
}
return true;
}

Cosa sto facendo di sbagliato quando provo a ottenere il mio canDeactivate modal per lavorare con più di un osservabile, e cosa dovrei fare?

risposte:

4 per risposta № 1

CombineLatest aspetterà che entrambi gli osservabili emettano un valore. Non succede mai per il tuo caso. Tu vuoi Observable.merge anziché.

return okResult.merge(cancelResult).take(1)

o

return Observable.merge(okResult, cancelResult).take(1)