Angular 2 - CanActivate Observable 在订阅后获得值(value)

标签 angular guard canactivate

如果用户已登录,我会在我的 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/

相关文章:

angular - mat-datepicker 只显示月份和年份

json - 空注入(inject)器错误 : No provider for JwtHelperService

C++ 包含结构

Angular 2 : AuthGuard not working when using browser navigation buttons

Angular 2.1 - 在路由时重新创建组件

javascript - Angular 2 中的类型 'subscribe' 不存在属性 'void'

javascript - Angular 8 - 如何将数据从 1 个组件导出到 2,然后再导出到 3

haskell - 模式匹配和守卫有什么区别?

javascript - 以 Angular 实现 canActivate auth 防护

angular - 如何在Angular中对所有路由(主路由和所有子路由)应用canActivate守卫