Angular2 - return 布尔值订阅 canActivate
Angular2 - return boolean with subscribe to canActivate
我是Angular的新手,我需要实现一个returns true/false的功能,我打算在canActivate guard中使用return,但是这个函数使用 http.get 的 api,所以就像通信是异步的一样,这个函数总是 return FALSE,因为 http.get 还在处理中。
我的class守卫:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
if (this.loginService.isLoggedIn()) {
return true;
}
this.loginService.redirectUrl = url;
this.router.navigate(['login']);
return false;
}
和函数 isLoggedIn()
isLoggedIn() {
let logged: boolean = false;
this.http.get('api/values', this.httpService.headers())
.map((res: Response) => {
logged = res.json();
});
return logged;
}
我看了很多问题,但没有找到答案。
guard typings 说它可以 return
Observable<boolean>, Promise<boolean> or boolean
所以将 isLoggedIn 更改为:
isLoggedIn() {
return this.http.get('api/values', this.httpService.headers())
.take(1)
.map((res: Response) => res.json());
}
更新
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.isLoggedIn().map(loggedIn => {
if(!loggedIn) {
this.loginService.redirectUrl = url;
this.router.navigate(['login']);
}
return loggedIn;
}
}
我是Angular的新手,我需要实现一个returns true/false的功能,我打算在canActivate guard中使用return,但是这个函数使用 http.get 的 api,所以就像通信是异步的一样,这个函数总是 return FALSE,因为 http.get 还在处理中。
我的class守卫:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
if (this.loginService.isLoggedIn()) {
return true;
}
this.loginService.redirectUrl = url;
this.router.navigate(['login']);
return false;
}
和函数 isLoggedIn()
isLoggedIn() {
let logged: boolean = false;
this.http.get('api/values', this.httpService.headers())
.map((res: Response) => {
logged = res.json();
});
return logged;
}
我看了很多问题,但没有找到答案。
guard typings 说它可以 return
Observable<boolean>, Promise<boolean> or boolean
所以将 isLoggedIn 更改为:
isLoggedIn() {
return this.http.get('api/values', this.httpService.headers())
.take(1)
.map((res: Response) => res.json());
}
更新
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.isLoggedIn().map(loggedIn => {
if(!loggedIn) {
this.loginService.redirectUrl = url;
this.router.navigate(['login']);
}
return loggedIn;
}
}