angularangular2-routingangular2-http

Angular 2 - Routing - CanActivate work with Observable


I have an AuthGuard (used for routing) that implements CanActivate.

canActivate() {
    return this.loginService.isLoggedIn();
}

My problem is, that the CanActivate-result depends on a http-get-result - the LoginService returns an Observable.

isLoggedIn():Observable<boolean> {
    return this.http.get(ApiResources.LOGON).map(response => response.ok);
}

How can i bring those together - make CanActivate depend on a backend state?

# # # # # #

EDIT: Please note, that this question is from 2016 - a very early stage of angular/router has been used.

# # # # # #


Solution

  • You should upgrade "@angular/router" to the latest . e.g."3.0.0-alpha.8"

    modify AuthGuard.ts

    @Injectable()
    export class AuthGuard implements CanActivate {
        constructor(private loginService: LoginService, private router: Router) {}
    
        canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
            return this.loginService
                .isLoggedIn()
                .map((e) => {
                    if (e) {
                        return true;
                    }
                })
                .catch(() => {
                    this.router.navigate(['/login']);
                    return Observable.of(false);
                });
        }
    }
    

    If you have any questions, ask me!