如果用户已登录,我会在我的 Web 服务上进行“CanActivate”检查。
“CanActivate”返回 Observable。唯一担心的是,如果用户已连接或未连接,我将需要恢复此 bool 值的值,以便在不重做第二个请求的情况下调整我的 View ...
canActivate(): Observable<boolean>|boolean {
return this.connected();
}
public connected() : Observable<boolean>{
return this.http.get(this.connectedUrl,{ withCredentials: true })
.map(this.extractBoolean)
.catch(this.handleError);
}
谢谢你的帮助
最佳答案
如果您想在后端发出请求时保存一些数据以确保用户已连接,而不是在 guard
中发出 HTTP 请求,请创建一个服务
执行此请求(无论如何这是一个很好的做法,无论是否要保存请求都应该这样做)。
就是说,在您的服务
中,它是一个单例,您可以简单地映射
您的调用(结果是一个Observable
)并且将值保存在您的服务
中。
例如:
@Injectable()
export class SomeService {
private userData: IUserData;
constructor(private http: Http) { }
getUserDataIfConnected() {
this.http.get('http://some-url')
.map((res: Response) => res.json() as IUserData)
.map(userData => this.userData = userData)
}
}
然后在你的守卫中:
canActivate(): Observable<boolean> {
return this.someService.getUserDataIfConnected()
// if there was no error, we don't care about the result, just return true : The user is connected
.mapTo(true)
// if the user wasn't logged, your backend shoud return an HTTP error code in the header
// and angular HTTP service will throw an error
.catch(err => return Observable.of(false))
}
它不必比这更复杂:)
关于Angular 2 - CanActivate Observable 在订阅后获得值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43909883/