2016-08-30 156 views
2

我想在登錄後在其他路由上導航我的用戶。Angular2 - 登錄後重定向

我在文檔中發現,這樣的事情應該爲它正常工作:

this.router.navigate(['/users']); 

我在compoenent完整的方法是這樣的:

// imports on top 
import { Component } from '@angular/core'; 
import { LoginService } from './login.service'; 
import { Router } from '@angular/router'; 

// method somewhere below 
login(event, username, password) { 
    event.preventDefault(); 
    let body = JSON.stringify({ username, password }); 

    this.loginService.login(body) 
     .then(res => localStorage.setItem('token', res.msg)) 
     .catch(error => this.error = error); 

    this.router.navigate(['/users']); 
} 

但是它不重定向我。基本上路線保持不變,在控制檯中沒有發現錯誤。

我在做什麼錯?

編輯: 我的路線是這樣的:

const appRoutes: Routes = [ 
    { path: 'login', component: LoginComponent}, 
    // users route protected by auth guard 
    { path: 'users', component: UsersComponent, canActivate: [AuthGuard] }, 
    // { path: 'user/:id', component: HeroDetailComponent }, 
    { path: '**', redirectTo: 'users' } 

]; 

我AuthGuard看起來像:

export class AuthGuard implements CanActivate { 

    constructor(private router: Router) { } 

    canActivate() { 
    if (localStorage.getItem('token')) { 
     // logged in so return true 
     return true; 
    } 

    // not logged in so redirect to login page 
    this.router.navigate(['/login']); 
    return false; 
    } 
} 
+0

數據你在響應從loginService.login得到什麼,如果是假的AuthGuard阻止用戶訪問該路由 –

+0

嘿@AnmolMittal是JSON對象:) – Andurit

回答

0

this.router.navigate([ '/用戶']); 這應該localStorage.setItem()之後被調用,。那麼()函數

如果仍然不能在裏面工作,可能你把類的代碼在你的信息,請

+0

嘿@Alexis Le Gall,謝謝你的回答。我同意,要使其正確,它應該在'.then'內。但是,這不應該影響路線變化或不。這應該只是作出改變,如果它重定向之前或之後,來自服務'響應'來 – Andurit

+0

錯誤可能來自您的路由文件,很難說只用這部分代碼 –

+0

編輯我的問題,並添加了請求的文件:) – Andurit

2

我有一個我的post上的問題非常類似。問題是認證用戶有延遲,但router.navigate立即執行。由於您網站的用戶部分受到保護,並且您的技術上仍未通過身份驗證,因此重定向失敗。

通過重定向.then它等待您的用戶登錄,如果成功,它會重定向您的用戶。

嘗試使用這樣的:

this.loginService.login(body) 
     .then(
      res => localStorage.setItem('token', res.msg) 
      this.router.navigate(['/users']); 
     ) 
     .catch(error => this.error = error);