CanActivate
class允许Observable<boolean>
返回类型。
对我来说唯一有用的用例是:
CanActivate
可以“异步”阻止正在显示的路由,直到observer.next(true|false)
被调用。CanActivate
允许的路线,然后从我应用的其他部分推送observer.next(false)
并让该路线消失。然而,第一点有效但不是第二点。因此,我找不到CanActivate
应该允许返回类型Observable<boolean>
而不是方便的原因 - 这反过来使API复杂化。如果CanActivate
仅允许boolean
返回类型和Promise
,则会更清晰。
请注意,我是Angular,RxJS以及基于Node的新手,所以我可能会忽略这一点。我花了一些时间尝试从CanActivate
中提取Observer<boolean>
返回类型所暗示的功能。
答案 0 :(得分:0)
在AngularJS 2中,几乎每个异步操作都返回Observable。因为您可以实现自己的CanActivate,所以您可能希望通过服务器访问来实现。例如,检查服务器中的管理员凭据。您可以看到类似的示例here。
如果此方法返回了布尔数据类型,则您需要阻止该页面才能执行此操作。
答案 1 :(得分:0)
它允许您执行一些异步过程。想象一下,您有一个来自身份验证服务的.bashrc
可观察对象。这是一个currentUser
并且将始终返回当前登录的用户,但是当您的应用首次加载时,auth呼叫可能仍在处理中,因此您不知道它是否已完成。
ReplaySubscriber(1);
答案 2 :(得分:0)
在Angular 7中,canActivate
可以返回Observable
,Promise
和一个简单的boolean
,并且HTTP
调用也是如此,因此您可以返回适合您的任何类型,对我来说,我将它们都用作以下内容:
对于Observable
:
public getCats(): Observable<Cat[]> {
return this.http.get<Cat[]>(this.catsUrl, this.getHttpOptions()).pipe(
tap(_ => this.log('fetched cats')),
catchError(this.handleError())
);
}
在canActivate
的情况下,我将Promise<boolean>
与HTTP
一起使用,情况如下:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
const currentUser = this.getCurrentUser();
if (currentUser) {
return this.http.post<any>(this.validateUserUrl, this.userData).toPromise().then(
response =>
{
return true;
}
).catch(
error=>
{
this.logout()
return false;
}
);
}
return new Promise<boolean>(()=> {return false;});
}