2016-08-30 158 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);