来自 Angular Route Guard 的 Web API 调用



谁能帮我解决为什么 Angular 守卫中的异步调用在调用返回结果后不会激活路由? 我已经尝试了几种利用承诺和可观察量的方法,但运气有限。 我还发现了这个 github 问题,特别是 albakov 的建议。 对我来说,重要的是要注意下面的代码片段执行。 我在控制台中看到控制台消息,其中包含我也能够在服务器端 api 调用中中断的所有正确值。 结果被传递到可观察的 canActivate 防护返回,但路由未按预期激活。

具有调用 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();
}

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

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

角度 2 - 路由 - 可以激活 使用可观察的工作

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

最新更新