Angular2在CanActivate

时间:2016-08-28 10:40:16

标签: angular

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

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

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

我的问题是,如何在解决问题之前阻止调用canActivate函数,或者以其他方式实现我想要的东西?

由于 最大

2 个答案:

答案 0 :(得分:12)

CanActivate始终在设计解析之前运行..

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

<强> 1。 CanActivate (身份验证):

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

<强> 2。解决(获取数据):

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

第3。构造函数/ OnInit (使用数据):

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

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

您可以阅读有关此in this thread on GitHub的更多信息。

答案 1 :(得分:10)

canActivate()可以返回booleanPromise<boolean>Observable<boolean>

如果您返回Promise或Observable,则在将它们解析为true之前,无法导航该组件。