Angular 路由器事件:NavigationEnd -- 如何仅过滤最后一个事件
Angular Router Events: NavigationEnd -- How to filter only the last event
我只想从 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]
?
我快看疯了,但好像只见树木不见森林...
好吧,在阅读了上面发布的文章并重新思考我真正想要实现的目标之后,我发现我的方法肯定太复杂了。因为实际上我只需要访问当前调用的路由。所以我从头开始,遇到了这个小但非常有效的解决方案:
this.router.events.subscribe(value => {
console.log('current route: ', this.router.url.toString());
});
感谢所有分享评论或支持我的人!它帮助了我很多,因为我能够解决未解决的问题。
PS。有一种更好的方法可以使用 instanceof typeguard 进行过滤,然后您无需再次断言即可获得正确的类型:
this.firstChildData$ = this.router.events.pipe(
filter((e): e is NavigationEnd => e instanceof NavigationEnd),
map(e => {
// e is now NavigationEnd
})
);
如果您使用的是 ngrx 效果,那么您可以创建一个监听路由器事件的效果:
import { NavigationEnd, Router } from '@angular/router';
routeTo$ = createEffect(
() =>
this.router.events.pipe(
filter(event => event instanceof NavigationEnd),
withLatestFrom(this.observable1$, this.observable1$),
tap(([routerEvent, observable11Value, observable12Value]) => {
if (this.router.url.includes(observable11Value) && !this.router.url.includes(observable12Value)) {
this.router.navigate([`/home/${observable11Value}`]);
}
})
),
{ dispatch: false }
);
this.router.events.subscribe(value => {
if(value instanceof NavigationEnd)
console.log(this.router.url.toString());
});
我只想从 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]
?
我快看疯了,但好像只见树木不见森林...
好吧,在阅读了上面发布的文章并重新思考我真正想要实现的目标之后,我发现我的方法肯定太复杂了。因为实际上我只需要访问当前调用的路由。所以我从头开始,遇到了这个小但非常有效的解决方案:
this.router.events.subscribe(value => {
console.log('current route: ', this.router.url.toString());
});
感谢所有分享评论或支持我的人!它帮助了我很多,因为我能够解决未解决的问题。
PS。有一种更好的方法可以使用 instanceof typeguard 进行过滤,然后您无需再次断言即可获得正确的类型:
this.firstChildData$ = this.router.events.pipe(
filter((e): e is NavigationEnd => e instanceof NavigationEnd),
map(e => {
// e is now NavigationEnd
})
);
如果您使用的是 ngrx 效果,那么您可以创建一个监听路由器事件的效果:
import { NavigationEnd, Router } from '@angular/router';
routeTo$ = createEffect(
() =>
this.router.events.pipe(
filter(event => event instanceof NavigationEnd),
withLatestFrom(this.observable1$, this.observable1$),
tap(([routerEvent, observable11Value, observable12Value]) => {
if (this.router.url.includes(observable11Value) && !this.router.url.includes(observable12Value)) {
this.router.navigate([`/home/${observable11Value}`]);
}
})
),
{ dispatch: false }
);
this.router.events.subscribe(value => {
if(value instanceof NavigationEnd)
console.log(this.router.url.toString());
});