在canDeactivate中处理两个observable

时间:2017-03-31 17:59:05

标签: angular typescript observable

在我的canDeactivate()路线保护中,我正在调用一个有两个按钮的模态:ok和cancel。如果单击确定按钮以便用户可以继续离开页面,我想返回true,如果单击取消按钮则返回false。这是我目前的代码:

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;
  }

最初测试时,我只有一个observable来检查ok按钮何时被调用,然后订阅它,然后返回结果。这有效,但它只适用于一个按钮,每当点击取消按钮时,这就打破了一切。这是我最初只用一个按钮就能完美运作的。

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;
  }

在尝试让我的canDeactivate模式与多个observable一起使用时,我做错了什么,我该怎么办?

1 个答案:

答案 0 :(得分:4)

CombineLatest将等待两个observable都发出一个值。这种情况从未发生过。您想要jobPool

Observable.merge

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