Возвращать логическое значение вместо подписки на canActivate
У меня есть компонент, защищенный с помощью canActivate guard. Автогвардия в checkLogin
Функция подписывается из наблюдаемой, но я не знаю, как вернуть логическое значение из нее в canActivate.
guard.service.ts
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
let url: string = state.url;
return this.checkLogin(url);
}
public checkService:boolean;
checkLogin(url: string):boolean {
return this.loadAppSettings().subscribe(res=>{
console.log(this.checkservice);
if (this.checkservice == true)
{
return true;
}
else{
this.router.navigate(['/error-user']);
return false;
}
});
}//checkLogin throws error as type subscription is not assignable to type boolean
Так что я хочу, если this.checkService
Значение true, оно должно просто возвращать значение true, и пользователь должен иметь возможность приземлиться на охраняемом маршруте, но если значение равно false, ему следует перейти к error-user
,
Angular2 - вернуть логическое значение с подпиской на canActivate этот вопрос похож на мой, но не смог решить мою проблему с ним.
Может ли кто-нибудь помочь здесь.
2 ответа
canActivate также может возвращать наблюдаемое, см. определение CanActivate-interface. Просто измените ваши типы возврата соответственно.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let url: string = state.url;
return this.checkLogin(url);
}
public checkService:boolean;
checkLogin(url: string):Observable<boolean> {
return this.loadAppSettings().map(res=>{
console.log(this.checkservice);
if (this.checkservice == true)
{
return true;
}
else{
this.router.navigate(['/error-user']);
return false;
}
});
}
Мы также можем вернуть Promise, например...
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Promise<boolean> {
return new Promise<boolean>(resolve => {
this.service
.function()
.toPromise()
.then((res) => {
if(condition) {
resolve(true);
} else {
this.router.navigate(["login"]);
resolve(false);
}
})
.catch(() => {
this.router.navigate(["login"]);
resolve(false);
});
});
}