简体   繁体   English

Angular2 .subscribe有时不会触发路由器。

[英]Angular2 .subscribe sometimes does not fire the router.navigate

I've a login function: 我有一个登录功能:

login(user: UserComponent) {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append("Authorization", "Basic " + btoa(user.username + ":" + user.password)); 
return this._http
  .get(
    'https://api.xxxxxxxxxxxx.com/rest/auth', 
    { headers }
  )
  .map(res => res.json())
  .subscribe(
    (data) => {
      this.loggedIn = true;
      console.log('data '+ this.loggedIn);
      localStorage.removeItem('auth_token');
      localStorage.setItem('auth_token', data.token);
      console.log(data.token);
      this._router.navigate(['']); 
    },
    (err) => {
      this.errorMsg = err.json().error_message
      console.log(this.errorMsg);
    }
  );}

isLoggedIn() {
    if(this.loggedIn){
      return true;
    }else{    
      this._router.navigate(['login']);
      return false;
    }
  }

that I call like this: 我这样称呼:

   constructor(private _userService: UserService, private _router: Router) {}

authUser() {
  let user = new UserComponent(this.username, this.password);
  this._userService.login(user);

} }

the CanActivate goes like this: CanActivate如下所示:

@Injectable()
export class LoggedInGuard implements CanActivate {
  constructor(private _userService: UserService) {}

  canActivate() {
    console.log(this._userService.isLoggedIn());
    return this._userService.isLoggedIn();
  }

}

UPDATE #1 I think I found the problem, but don't know how to solve. 更新#1我想我找到了问题,但不知道如何解决。 I updated the code above with the current version. 我使用当前版本更新了上面的代码。

Looks like the problem is when it performs the action the Guard runs before the this.loggedIn is set to true.... returning false yet... why? 看起来问题出在当this.loggedIn设置为true之前,它执行Guard运行的动作时。 how do I fix this? 我该如何解决?

Thank you 谢谢

You login function is asynchronous and that is why console.log happening before you get data from your service. 您的登录功能是异步的 ,这就是为什么console.log在从服务中获取数据之前发生的原因。 You need to wrap console.log in you login function to see data 您需要在登录功能中包装 console.log才能查看数据

this._userService.login(user).subscribe(
  (data) =>{
    this.data = data
    console.log(this.data);
   },
(err) => this.errorMsg = err.json().error_message);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM