Angular2在CanActivate之前解决

Max*_*ord 8 angular

我有一个身份验证服务,它实现了Resolve接口,以返回一个从服务器检索到用户身份验证状态后解析的observable.

此相同的身份验证服务实现CanActivate接口,以阻止用户在未登录的情况下访问组件.

目前,在解析resolve函数之前触发canActivate函数,这意味着它在从服务器检索登录状态之前检查用户的登录状态.

我的问题是,如何在解析resolve之前阻止调用canActivate函数,或者是否有其他方法可以实现我想要的?

谢谢马克斯.

Jef*_*aal 19

CanActivate总是在设计解决之前运行..

因为解析器应该只在CanActivate警卫完成他们的工作(认证,清理......)之后运行.当您遵循此模式(见下文)时,通常没有理由反转或更改此顺序.


1. CanActivate(身份验证):

  • 验证/验证用户.
  • 获取从服务器或API查询/获取数据所需的令牌.
  • 使用一个PromiseObservable确保解析器等待CanActivate后卫来完成.

2.解决(获取数据):

  • 当所有警卫都过去了,然后是解决方案运行的时候了.
  • 在确定用户已通过身份验证时获取数据.
  • 使用令牌等从服务器获取数据
  • 使用一个PromiseObservable确保当解析数据是可用的组件被加载.

3. constructor/OnInit(使用数据):

  • 从解析器获取数据(例如,ActivatedRoute.snapshot.data).
  • 渲染模板中的数据或将其发送到服务.

如果,不知何故,你真的需要等待解析器完成,只需将代码从防护装置移动到解析器.

您可以在GitHub上的这个帖子中阅读更多相关信息.

  • 如果子路由受保护,我会假设父路由解析器在子路由保护之前运行,但事实并非如此。我该如何解决这个问题? (3认同)
  • 假设我们有一个尝试编辑对象的用户帐户(所有用户都可以看到所有对象,但用户只能编辑他们自己的对象(例如博客系统))。解析器将获得帖子,并且`canActivate` 将处理特定用户是否可以编辑特定帖子的问题。这只是一个例子,但重点是,有很多正当理由可以反过来做。 (2认同)

j2L*_*L4e 12

canActivate()可以返回a boolean,Promise<boolean>Observable<boolean>.

如果返回Promise或Observable,则在解析组件之前无法导航组件true.

  • 您可以发布示例代码,您是如何解决这个问题的?具体来说,如何激活等待解析器完成? (8认同)
  • @AmitGoenka我认为答案作者的意思是,CanActivate接口(守卫)不是从服务器获取状态,而是解析器从服务器获取状态;在 canActivate() 函数中,返回 HTTP 请求的可观察值。答案可能有点误导,因为它“不是”在守卫之前触发解析器,而是在 CanActivate 守卫中返回一个 Observable(或 Promise)。 (4认同)