【问题标题】:Angular2 Resolve before CanActivateAngular2 在 CanActivate 之前解决
【发布时间】:2017-01-04 13:13:06
【问题描述】:

我有一个身份验证服务,它实现了 Resolve 接口以返回一个可观察对象,一旦从服务器检索到用户的身份验证状态,该对象就会被解析。

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

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

我的问题是,如何防止 canActivate 函数被调用,直到 resolve 被解决,否则还有其他方法可以实现我想要的吗?

谢谢 最大。

【问题讨论】:

    标签: angular


    【解决方案1】:

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

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


    1. CanActivate(身份验证):

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

    2。解决(获取数据):

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

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

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

    如果您真的需要等待解析器完成,只需将您的代码从守卫移至解析器

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

    【讨论】:

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

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

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

    【讨论】:

    • 谢谢,成功了
    • 您能否发布一个示例代码,您是如何解决这个问题的?具体来说,canactivate 是如何等待解析器完成的?
    • @AmitGoenka 我认为答案作者的意思是,不是解析器从服务器获取状态,而是 CanActivate 接口(守卫)从服务器获取状态;在 canActivate() 函数中,返回 HTTP 请求的 observable。答案可能有点误导,因为它在守卫之前触发解析器,而是在 CanActivate 守卫中返回一个 Observable(或 Promise)。
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2013-12-29
    相关资源
    最近更新 更多