Наблюдаемая угловая - как вернуть истину или ложь из подписки на наблюдаемую
У меня есть функция canDeactivate
который должен либо вернуться true
или же false
, Это можно определить по результату вызова openConfirmDialog()
функция, которая открывает модальное диалоговое окно "Подтверждение" ngx-bootstrap и ожидает ответа пользователя (который может привести к true
или же false
). Вот код:
canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> {
// if there are no pending changes, just allow deactivation; else confirm first
return component.canDeactivate() ?
true :
this.openConfirmDialog();
}
openConfirmDialog() {
this.modalRef = this.modalService.show(ConfirmationComponent);
return this.modalRef.content.onClose.subscribe(result => {
console.log('results', result);
})
}
result
от подписки на this.modalRef.content.onClose
работает. Я могу успешно войти true
или же false
, Когда результат становится либо true
или же false
хотя, как мне вернуться true
или же false
как значение canDeactivate
? Или я упускаю суть, и я должен делать вещи по-другому?
мой ConfirmationComponent
выглядит так, что определяет onClose
как Observable<boolean>
(конкретно Subject<boolean>
), так что я могу успешно вернуть логическую наблюдаемую, но как мне получить canDeactivate
возвращать true
или же false
всякий раз, когда openConfirmDialog
получает значение true
или же false
?
@Component({
templateUrl: './confirmation.component.html'
})
export class ConfirmationComponent {
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();
}
}
1 ответ
Благодаря @David я изменил свою подписку на onClose
к map
а не subscribe
и это работает:
openConfirmDialog() {
this.modalRef = this.modalService.show(ConfirmationComponent);
// line below - change from 'subscribe' to 'map'
return this.modalRef.content.onClose.map(result => {
return result;
})
}
Однако, как указал @Ingo Burk, я могу просто использовать:
openConfirmDialog() {
this.modalRef = this.modalService.show(ConfirmationComponent);
return this.modalRef.content.onClose;
}