任何人都可以帮助我解决为什么在从调用返回结果后 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 调用后,如果我启用跟踪,路由器将取消导航到受保护的路由。
| 归档时间: |
|
| 查看次数: |
5060 次 |
| 最近记录: |