有人能帮我解决为什么在从调用返回结果后,角保护内的异步调用不会激活路由吗?我尝试了几种方法,利用承诺和观察有限的运气。我还找到了这个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();
}
没有任何类型的控制台错误发生,页面只是从来没有路由后,可观察布尔值的解析为真。
如果我将从登录组件重定向到受保护(受保护的)路由更改为硬重定向(即:)(即: window.location.href),而不是router.navigate
调用,那么上面的代码就能工作。如果没有这个从登录组件的硬重定向,路由器将取消导航,如果我启用跟踪,则在解析api调用后取消导航到受保护的路由。
发布于 2017-07-20 06:20:16
只要在守卫中返回可观察(Observable<boolean>
),它就能工作了!
https://stackoverflow.com/questions/45175179
复制