Vo svojom strážcovi trasy canDeactivate () volám amodal, ktorý má dve tlačidlá: ok a zrušiť. Chcem sa vrátiť, ak kliknete na tlačidlo OK, takže používateľ môže pokračovať v odchode zo stránky a vráti sa k falošu, ak klikne na tlačidlo Zrušiť. Tu je môj aktuálny kód:
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;
}
Spočiatku, keď som to skúšal, mal som lenjeden pozorovateľný pre kontrolu, keď sa zavolá tlačidlo ok, a potom sa k tomu prihlási a vráti výsledok. Toto fungovalo, ale fungovalo len pre jedno tlačidlo a vždy, keď kliknete na tlačidlo Zrušiť, toto všetko rozbilo. Tu je to, čo som mal pôvodne, že pracoval perfektne len pre jedno tlačidlo.
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;
}
Čo robím zle, keď sa snažím, aby moja canDeactivate modal pracovať s viac ako jedným pozorovateľným a čo mám robiť?
odpovede:
4 pre odpoveď č. 1CombineLatest bude čakať, kým obidva pozorovateľné hodnoty vydajú hodnotu. To sa nikdy nestane pre váš prípad. Chceš Observable.merge
miesto.
return okResult.merge(cancelResult).take(1)
alebo
return Observable.merge(okResult, cancelResult).take(1)