2016-10-04 23 views
0

我正在嘗試編寫一個路線警衛。這裏是我的路線......無法導航到門戶的應用程序

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

和這裏的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(['/']); 
    } 
} 

而這裏的ApplicationState你在哪裏得到來自用戶...

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

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

我希望用戶能夠如果用戶對象上存在UserToken,則訪問/門戶路由。但是,如果令牌不存在,我希望用戶導航到登錄頁面(默認路由/)。

我有一個鏈接/門戶,我嘗試點擊。 checkLogin()中的appState.User.map返回true,但是該應用程序從不導航到/ portal。

我在做什麼錯?這是那種「冷可觀察」情況嗎?

回答

1

試試這個:

@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; 
    } 

    // ... 
}