来自Angular Route Guard的Web Api电话

时间:2017-07-18 19:08:52

标签: angular rxjs

任何人都可以帮助我解决为什么Angular后卫内的异步调用在调用返回结果后不会激活路由的原因?我尝试了几种利用承诺和观察能力有限的方法。我还发现了这个github issue特别是albakov的建议。对我来说,重要的是要注意下面的片段执行。我在控制台中看到控制台消息,其中包含所有正确的值,我也可以在服务器端api调用中断。结果传递给canActivate后卫返回的observable,但路线未按预期激活。

具有调用api的属性的服务方法,并使用结果绑定_isAuthorized主题:

private _isAuthorized: ReplaySubject<boolean> = new ReplaySubject(1);
get isAuthorized() { return this._isAuthorized.asObservable(); }

checkAuthority(id: number) {
    return this._http.get(this._apiUrl).toPromise().then((response) => {
        console.log(response + ' I resolved!');
        if (response.status === 200)
            this._isAuthorized.next(true);
    });

消费守卫可以激活方法:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any {
  let id: number = this.getId();

  if (!this._oauthService.hasValidIdToken()) {
    this._router.navigate([`/login/${id}`]);
    return Observable.of(false);
  }

  this._myService.checkAuthority(id);
  return this._myService.isAuthorized.first();
}

在可观察布尔值的解析为真后,页面永远不会发生任何类型的控制台错误。

更新 如果我将重定向更改为从登录组件到硬重定向(即:window.location.href)而不是router.navigate调用的受保护(保护)路由,则上述代码可以正常工作。如果没有来自登录组件的硬重定向,路由器会在解析api呼叫后取消导航(如果我启用跟踪)到受保护路由。

1 个答案:

答案 0 :(得分:2)

Angular 2 - Routing - CanActivate work with Observable

只需在守卫中返回可观察的(Observable<boolean>),它就会起作用!