来自 Angular Route Guard 的 Web Api 调用

Sha*_*awn 3 rxjs angular

任何人都可以帮助我解决为什么在从调用返回结果后 Angular 防护内部的异步调用不会激活路由的问题吗?我尝试了几种方法,利用 Promise 和 observables 运气有限。我还发现了这个github 问题,特别是 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);
    });
Run Code Online (Sandbox Code Playgroud)

消耗守护激活方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jan*_*tze 6

Angular 2 - Routing - CanActivate 与 Observable 一起工作

只需返回Observable<boolean>守卫中的 observable( ) 就可以了!