Наблюдаемая угловая - как вернуть истину или ложь из подписки на наблюдаемую - PullRequest
0 голосов
/ 21 мая 2018

У меня есть функция 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 Ответ

0 голосов
/ 21 мая 2018

Благодаря @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;
  }
...