我已经解决了我的问题,但是我想了解为什么会这样。
我在敲击我的头读物和东西,但是找不到为什么它在subscribe块上复制输出的原因。
这里是带有代码的堆叠闪电战
https://stackblitz.com/edit/angular-szwnz7
我的思路是。
在该组件上,在每个要导航段类型的路由器事件上,我都想获取段ID。
但是路由器事件中没有什么让我感兴趣。因此,我使用switchMap
Observable进行了activatedRoute.queryParamMap
处理,以便在订阅块内部获取ID号。
并且每次我在链接之间单击时,它都会显示两个console.logs。
[想象一下this.route.queryParamMap
充当BehaviorSubject,这意味着,一旦您订阅它,您将获得现有值,而新值随后到达。
现在解释您的代码,单击链接时会发生什么:
this.router.events
发出新的NavigationEnd,然后切换到this.route.queryParamMap
this.route.queryParamMap
具有现有值,并且此现有值到达订阅this.route.queryParamMap
,您现在已订阅此Observable。由于导航,新的价值也到达了这里。 this.router.events
和this.route.queryParamMap
都是独立的Observable,在导航时均会发射。所以这就像比赛条件。由于this.router.events
切换为this.route.queryParamMap
的现有值,因此获得第一个值,而另一个则直接来自this.route.queryParamMap
。这就是为什么另一个值到达订阅的原因。