角度路由器事件:NavigationEnd - 如何仅过滤最后一个事件

时间:2018-04-08 20:19:51

标签: angular typescript angular-routing

我想从router.events中仅提取类型为NavigationEnd的最后一个事件条目。但不知何故,我找不到合适的方法来做到这一点。无论我尝试什么,下面的代码剪断是访问这些感兴趣的对象的唯一方法。

let ne: any;

router.events.filter(e => e instanceof NavigationEnd)
   .forEach(e => {
      ne = e as NavigationEnd;                 
   });

console.log('target page: ', ne.urlAfterRedirects);

但我真的必须使用.forEach()让它运行所有条目然后使用最后一个条目吗?是不是有更好的方法来处理事件作为一种数组,然后说

ne = arrayOfEvents[arrayOfEvents.length-1]

我对此感到疯狂,但似乎我看不到树上的木头......

3 个答案:

答案 0 :(得分:4)

好的,在阅读了上面发表的文章并重新思考我真正想要实现的目标之后,我发现我的方法肯定太复杂了。因为实际上我只需要访问当前调用的路由。所以我从零开始,遇到了这个小但非常有效的解决方案:

this.router.events.subscribe(value => {
    console.log('current route: ', router.url.toString());
});

感谢所有在oder中发表评论的人来支持我!它帮助很多,因为我能够束缚松散的目标。

答案 1 :(得分:4)

PS。有一种更好的方法可以使用'typeguard'进行过滤,您无需重新声明即可获得正确的类型:

firstChildData$ = this.router.events.pipe(

            filter((e): e is NavigationEnd => e instanceof NavigationEnd), 

            map(e => { // e is now NavigationEnd }

enter image description here

这在严格模式下实际上是必需的。

答案 2 :(得分:0)

如果您使用的是ngrx效果,则可以创建一个监听路由器事件的效果:

--shared