2016-10-04 3 views
0

Ich versuche, eine Route Guard zu schreiben. Hier ist mein Weg ...Kann App nicht zum Portal navigieren

{ path: 'portal', component: PortalComponent, canActivate: [AuthGuard] } 

Und hier ist AuthGuard:

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private appState: ApplicationState, private router: Router) {} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
     let url: string = state.url; 
     return this.checkLogin(url); 
    } 

    checkLogin(url: string): Observable<boolean> { 
     return this.appState.User.map(
      (user) => { 
       if (user.UserToken) return true; 

       this.navToLogin(url); 
       return false; 
      } 
     ); 
    } 

    private navToLogin(redirUrl: string) { 
     this.appState.RedirectUrl = redirUrl; 
     this.router.navigate(['/']); 
    } 
} 

Und hier ist ApplicationState, wo Sie die Benutzersuche von ...

@Injectable() 
export class ApplicationState { 
    private _user: BehaviorSubject<LoginUser> = new BehaviorSubject<LoginUser>(new LoginUser()); 

    get User() { 
     return this._user.asObservable(); 
    } 
} 

ich der Benutzer möchte in der Lage sein, Zugriff auf die/portal-Route, wenn das UserToken für das User-Objekt existiert. Wenn das Token jedoch nicht existiert, möchte ich, dass der Benutzer zur Anmeldeseite (Standardroute /) navigiert.

Ich habe einen Link zu/Portal, das ich versucht zu klicken. Und die appState.User.map in checkLogin() gibt true zurück, die App navigiert jedoch nie zu/portal.

Was mache ich falsch? Ist das eine dieser "kalt beobachtbaren" Situationen?

Antwort

1

Versuchen Sie folgendes:

@Injectable() 
export class ApplicationState { 
    private _user: BehaviorSubject<LoginUser> = new BehaviorSubject<LoginUser>(new LoginUser()); 

    get User() { 
     return this._user.value; 
    } 
    // login(user: LoginUser) { this._user.next(user); } 
} 


@Injectable() 
export class AuthGuard implements CanActivate { 
    // ... 

    checkLogin(url: string): boolean { 
     if (this.appState.User.UserToken) return true; 

     this.navToLogin(url); 
     return false; 
    } 

    // ... 
} 
Verwandte Themen