Angular 2 canActivate 承诺命中远程服务
Angular 2 canActivate with a promise hitting a remote service
首先,我不确定这是处理这个问题的最佳方法,但我正在寻找的是“/”上的路由保护,它检查用户是否已登录,如果是则重定向他们到“/仪表板”。我想在加载路由之前执行此操作,以避免在远程服务器上检查身份验证状态后屏幕闪烁。
我正在实现 canActivate 接口,但它没有按预期工作。它命中了 auth 服务和 returns 用户,根据此测试代码应该重定向用户,但我在控制台中看到了用户但没有重定向。
这是代码
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);
});
});
}
}
这是因为 'this' 绑定。由于 'this' 不是您的组件 class 实例,因此您的代码很可能在 console.log 之后进入 catch 块。使用“胖箭头”来解决这个问题。喜欢:
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);
});
})
首先,我不确定这是处理这个问题的最佳方法,但我正在寻找的是“/”上的路由保护,它检查用户是否已登录,如果是则重定向他们到“/仪表板”。我想在加载路由之前执行此操作,以避免在远程服务器上检查身份验证状态后屏幕闪烁。
我正在实现 canActivate 接口,但它没有按预期工作。它命中了 auth 服务和 returns 用户,根据此测试代码应该重定向用户,但我在控制台中看到了用户但没有重定向。
这是代码
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);
});
});
}
}
这是因为 'this' 绑定。由于 'this' 不是您的组件 class 实例,因此您的代码很可能在 console.log 之后进入 catch 块。使用“胖箭头”来解决这个问题。喜欢:
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);
});
})