首页 > 解决方案 > Resolver 或 Guard - 更适合使用 ngrx 获取数据

问题描述

使用 Angular 和 ngrx,我想导航到一条路线并确保所需的数据在 ngrx/store 中可用。我正在使用 ngrx/store action/effect/reducer 来物理调用 API。路由正在加载的组件通过存储访问数据,因为系统的其他部分可能会更新数据。

如果数据加载失败,则会调度 LOAD_FAILED 操作,这可以通过多种方式进行处理。

我应该使用警卫还是解析器?每种方法的其他优点和缺点是什么?你尝试过什么,如果你有时间,你会以同样的方式做吗?以下是我的一些想法。

选项 1:守卫

当路由被访问时,守卫的 canActivate 检查数据是否在 store 中,如果没有,则从 API 加载它,并将其添加到 store 中。如果数据加载失败,canActivate 将返回 false(作为 observable)。

这种方法的缺点是“加载数据不应该是守卫的责任”,但如果无法加载数据,则会阻止访问,并且路由器可以处理掉到“未找到”的情况,两者都是属于职责范围内。

选项 2:解析器

当路由被访问并且任何其他守卫允许激活时,将调用解析器。此解析器检查数据是否在存储中,如果没有,则触发 LOAD 操作,从 API 加载并添加到存储中。然后,一旦加载了数据,解析器就会返回一些任意数据,这些数据会被路由/组件丢弃,因为组件使用存储。如果数据加载失败,某些内容会重定向到未找到的页面

这种方法的缺点是解析器没有在传统意义上使用,例如它返回的数据被丢弃。此外,解析器需要在未找到时重定向到 404,或者 LOAD_FAILED 需要重定向。这增加了复杂性,因为有时 LOAD_FAILED 不应该重定向,例如当后台操作触发加载时。从好的方面来说,加载数据是解析器的责任。

标签: angularngrxngrx-store

解决方案


我认为在您的情况下,您可以使用 Guards 或 Resolvers。

我个人认为解析器更适合预取数据。我认为丢弃数据没有问题。您还可以向最终组件提供一些有关数据检索的有用信息(例如,如果数据仅部分可用)。

我真的不明白在解析器中进行重定向的缺点是什么意思。我相信不存在这样的问题,您可以在 Resolver 中处理重定向,如Angular guide中所示。在获取失败的基本情况下,路由事件将被取消,用户将留在当前页面上。

正如我所见,使用 Guards 的唯一真正优势是您可以在队列中执行它们。它可能允许您创建更通用和可重用的 Guard 类,其中每个 Guard 负责检索特定的数据位。另一方面,解析器更特定于路由而不是特定于数据。


推荐阅读