7

首先,我不确定这是处理此问题的最佳方法,但我正在寻找的是“/”上的路由保护,它检查用户是否登录,如果是,则将他们重定向到“/dashboard” . 我想在加载路由之前执行此操作,以避免屏幕闪烁,因为正在检查远程服务器上的身份验证状态。

我正在实现 canActivate 接口,但它没有按预期工作。它命中身份验证服务并返回用户,根据此测试代码应该重定向用户,但我在控制台中看到用户但没有重定向。

这是代码

import { Injectable }               from '@angular/core';
import { Router, CanActivate }      from '@angular/router';

import { Observable }               from 'rxjs/Observable';

import { User }                     from './../../models/user.model';
import { AuthService }              from './auth.service';

@Injectable()
export class HomeAuthGuard implements CanActivate {
  constructor(
    private router: Router,
    private authService: AuthService
  ) {}

  canActivate(): Promise<boolean> {
    return new Promise((resolve) => {
      this.authService.getStatus()
        .then(function (user: User) {
          console.log('home auth', user)
          this.router.navigate(['/dashboard']);
          resolve(false);
        })
        .catch(function () {
          resolve(true);
        });
      });
  }
}
4

1 回答 1

18

这是因为“this”绑定而发生的。由于“this”不是您的组件类实例,您的代码很可能会在 console.log 之后被捕获块。使用“胖箭头”来解决这个问题。喜欢:

return new Promise((resolve) => {
  this.authService.getStatus()
    .then((user: User) => {
      console.log('home auth', user)
      this.router.navigate(['/dashboard']);
      resolve(false);
    })
    .catch(err => {
      resolve(true);
    });
  })
于 2017-04-18T10:32:38.123 回答