如何使Angular canDeactivate Service等待模式对话框响应?

时间:2019-10-16 14:45:07

标签: angular asynchronous angular-material modal-dialog candeactivate

我在组件内部有一个函数,可以通过评估表单状态来检查是否可以离开路线。 如果状态与我需要退出路线的条件相匹配,则会显示一个对话框以确认或取消。 我在canDeactivate服务中调用了此函数,但它会在等待对话框确认之前触发响应。

我已经将带有组件功能的console.log放入canDeactivate服务中。 如果不需要确认,则按预期显示true。但是,另一方面,当需要确认时,在对话框出现之前它会显示为undefined。

canDeactivateService.ts

@Injectable()
export class ProdutosDeactivateGuard implements CanDeactivate<ExampleComponent> {

  canDeactivate(
      component: ExampleComponent,
      route: ActivatedRouteSnapshot,
      state: RouterStateSnapshot
    ): boolean {
      return component.checkStatus();
  }
}

example-component.ts

checkStatus() {
    if (!this.form.pristine && this.form.touched) {
      const dialogRef = this.dialog.open(DeactivateDialogComponent);
      dialogRef.afterClosed().subscribe(result => {
        if (result === 'true') {
          return true;
        } else {
          return false;
        }
      });
    } else {
      return true;
    }
  }
}

我希望服务等待确认。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您是否尝试过返回可观察值?正如我在您的代码afterClosed()中看到的那样,返回一个。

例如:

@Injectable()     出口类ProdutosDeactivateGuard实现CanDeactivate {

canDeactivate(
      component: ExampleComponent,
      route: ActivatedRouteSnapshot,
      state: RouterStateSnapshot
    ): Observable<boolean> {
      return component.checkStatus();
  }
}

checkStatus() {
    if (!this.form.pristine && this.form.touched) {
      const dialogRef = this.dialog.open(DeactivateDialogComponent);
      return dialogRef.afterClosed().pipe(map(result => {
        return result === 'true';
      }));
    } else {
      return of(true);
    }
  }
}