我有一个身份验证服务,它实现了Resolve接口,以返回一个从服务器检索到用户身份验证状态后解析的observable .
此相同的身份验证服务实现CanActivate接口,以阻止用户在未登录的情况下访问组件 .
目前,在解析resolve函数之前触发canActivate函数,这意味着它在从服务器检索登录状态之前检查用户的登录状态 .
我的问题是,如何在解析resolve之前阻止调用canActivate函数,或者是否有其他方法可以实现我想要的?
谢谢马克斯 .
canActivate()可以返回 boolean , Promise<boolean> 或 Observable<boolean> .
boolean
Promise<boolean>
Observable<boolean>
如果返回Promise或Observable,则在将组件解析为 true 之前,无法导航组件 .
true
CanActivate always runs before resolve by design..
因为解析器应该只在CanActivate警卫完成他们的工作(认证,清理......)之后运行 . 当您遵循此模式(见下文)时,通常没有理由反转或更改此顺序 .
1. CanActivate (认证):
验证/验证用户 .
获取从服务器或API查询/获取数据所需的令牌 .
使用 Promise 或 Observable 确保解析器等待CanActivate防护完成 .
Promise
Observable
2. Resolve (获取数据):
当所有警卫都过去了,然后是解析器运行的时候了 .
当您确定用户已通过身份验证时获取数据 .
使用令牌等从服务器获取数据
使用 Promise 或 Observable 确保在解析数据可用时加载组件 .
3. constructor/OnInit (使用数据):
从解析器获取数据(例如, ActivatedRoute.snapshot.data ) .
ActivatedRoute.snapshot.data
渲染模板中的数据或将其发送到服务 .
如果,不知何故,你真的需要等待解析器完成,只需将代码从防护装置移动到解析器 .
你可以阅读更多关于这个in this thread on GitHub的信息 .
2 回答
canActivate()可以返回
boolean
,Promise<boolean>
或Observable<boolean>
.如果返回Promise或Observable,则在将组件解析为
true
之前,无法导航组件 .CanActivate always runs before resolve by design..
因为解析器应该只在CanActivate警卫完成他们的工作(认证,清理......)之后运行 . 当您遵循此模式(见下文)时,通常没有理由反转或更改此顺序 .
1. CanActivate (认证):
验证/验证用户 .
获取从服务器或API查询/获取数据所需的令牌 .
使用
Promise
或Observable
确保解析器等待CanActivate防护完成 .2. Resolve (获取数据):
当所有警卫都过去了,然后是解析器运行的时候了 .
当您确定用户已通过身份验证时获取数据 .
使用令牌等从服务器获取数据
使用
Promise
或Observable
确保在解析数据可用时加载组件 .3. constructor/OnInit (使用数据):
从解析器获取数据(例如,
ActivatedRoute.snapshot.data
) .渲染模板中的数据或将其发送到服务 .
如果,不知何故,你真的需要等待解析器完成,只需将代码从防护装置移动到解析器 .
你可以阅读更多关于这个in this thread on GitHub的信息 .