Tengo un componente protegido con canActivate guard. El Authguard en la función checkLogin se suscribe desde un observable pero no sé cómo devolver un valor booleano a canActivate.
guardia.servicio.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 Entonces, lo que quiero es que si this.checkService es verdadero, solo debería devolver verdadero y el usuario debería poder aterrizar en la ruta protegida, pero si es falso, debería navegar a error-user .
Angular2 - return boolean with subscribe to canActivate esta pregunta es similar a la mía pero no pudo resolver mi problema con ella.
¿Alguien puede ayudar aquí?
canActivate también puede devolver un observable, consulte la definición CanActivate-interface . Simplemente cambie sus tipos de devolución en consecuencia.
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; } }); }También podemos devolver Promise como...
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); }); }); }