首页 > 解决方案 > Navigation ID is not equal to the current router navigation id 错误

问题描述

我在我的 Angularv5 应用程序中使用@ngrx/router-store并且我最近开始遇到一个错误:(Navigation ID X is not equal to the current navigation id Y其中 X 和 Y 是整数)。

当我从特定路线 B ​​导航到路线 A 时,这个问题一直发生。从任何其他路线导航到路线 A 似乎工作正常。

我发现的与此相关的唯一其他SO 问题提供了该问题可能是由多次快速更新导航引起的。为了测试这是否发生(不应该发生),我在根组件中订阅了路由器导航事件,在订阅中设置了一个断点,并打开了一个调试会话来逐步解决问题。这样做,我可以看到

  1. 假设当前导航 ID 是 11。当我导航到问题路线时,路由器开始导航,成功执行每个导航事件,包括NavigationEnd然后立即 @ngrx/router-store 抛出一个'ROUTER_CANCEL'动作,说明:Navigation ID 12 is not equal to the current navigation id 13。据我所知,12 是正确的导航 ID(同样,导航 ID 11 完成并立即'ROUTER_CANCEL'被抛出,而路由器不会发出任何进一步的导航事件)。此外,'ROUTER_CANCEL'操作负载包含导致问题的路由器导航事件以及导致问题时商店的状态。导致问题的事件的 ID 为 12,当时商店中的路由器状态的 ID 为 11。因此,12 似乎是正确的导航 ID,不应该引发错误。

  2. 在从问题路由导航到用户配置文件路由时,在 @ngrx/router-store 取消导航之前不会发生其他导航。(即我没有快速更新导航路线)

  3. 除了 ngrx 调度'ROUTER_CANCEL'操作之外,不会报告任何错误(也不会引发错误)。

同样,除非导航从特定路线 B ​​开始,否则遇到问题的路线工作正常。据我所知,这条特定路线 B ​​没有什么不同或不寻常的(问题路线 A 也不关心人们来自哪里——这两条路线彼此没有关联)。

最后一件事:在调试会话之外触发错误似乎总是会导致表单Navigation ID X is not equal to the current navigation id X+1中的错误,但是在调试会话中触发错误可能会导致Navigation ID 11 is not equal to the current navigation id 15orNavigation ID 13 is not equal to the current navigation id 20等​​。

有谁知道发生了什么?我对@ngrx/router-store 不够熟悉,无法真正猜测这可能是如何发生的。我的假设是,当@ngrx/router-store 接收到事件时,商店中的导航 ID 值会同步增加NavigationEnd所以我什至不确定这些 id 是如何出现乱序的——更不用说在这种情况下id 似乎是正确的。

任何想法都非常感谢!

PS:我很高兴发布代码,但我的应用程序很大,我不知道这个错误是从哪里触发的。

标签: angulartypescriptngrxangular-routerngrx-router-store

解决方案


我想到了!调用事件的组件有代码。所以答案类似于这个 SO 问题中的答案(迅速改变路线)。router.navigate()NavigationEnd

我收到此错误是因为我连续两次调用 router.navigate (1 次追加 queryParams,1 次追加片段)所以不得不重构我的代码只调用一次导航。


推荐阅读