Angular 7、Ngrx、Rxjs 6 - 访问延迟加载模块之间的状态
Posted
技术标签:
【中文标题】Angular 7、Ngrx、Rxjs 6 - 访问延迟加载模块之间的状态【英文标题】:Angular 7, Ngrx, Rxjs 6 - Accessing state between lazy loaded modules 【发布时间】:2019-10-05 13:58:33 【问题描述】:我将 Angular 7 与 Ngrx 和 Rxjs 6 一起使用。我有 2 个延迟加载的模块 A 和 B,它们有自己的选择器和缩减器。
现在,我想从模块 A 访问存储在模块 B 状态上的数据。问题是模块 B 的所有 ngrx 组件只有在用户导航到 B 的延迟加载路由时才被初始化,因此,如果用户首先转到 A ,尝试选择状态将导致未定义的错误,因为 B 尚未初始化。
在这种情况下,访问延迟加载模块状态的最佳做法是什么?
【问题讨论】:
按照设计,依赖延迟加载的模块是一种不好的做法。为什么不在浏览器中始终存在的根级别创建商店。 我同意@AmitChigadani,如果该状态被多个模块使用,那么可能属于父状态。特别是如果其中一个模块正在延迟加载。 我也同意。无论是否作为延迟加载模块的一部分,reducer 都应该在根目录初始化。 虽然我可能决定按照自己的建议移动减速器,因为在选择之前不会提出请求,所以它似乎不会影响性能,但我仍然想知道为什么会有 StoreModule.forFeature然后导入Ngrx?用例会是什么? @JCherryhomes。在大多数应用程序中,状态最终将始终在功能模块之间共享 @PiotrJerzyMamenas 我会说这取决于。如果您有一个访问受限的模块,那么存在仅对这些模块可用的状态也是有意义的。但是这里的主要问题是,如果状态是作为延迟加载模块的一部分加载的,那么在该模块加载之前它根本不可用,因为它还不存在。我认为这里的选项要么不延迟加载该模块,要么将状态移动到将被加载并可用的共享模块。 【参考方案1】:在我看来,他的用例是有效的,ngrx 应该能够处理它,但是如果没有通过 forFeature 函数将 reducer 添加到 ngrx,它会丢弃状态,因为尚未加载延迟加载的模块,这使得不可能从后端的数据库中检索整个状态,并根据需要在延迟加载的模块中使用它。
【讨论】:
以上是关于Angular 7、Ngrx、Rxjs 6 - 访问延迟加载模块之间的状态的主要内容,如果未能解决你的问题,请参考以下文章
如何从 RxJS combineLatest 中删除瞬态事件与 NGRX 存储源 observable
rxjs-websockets - 如何封装为 Angular 6/7 服务