Пример:
const router = inject(Router);
router.events
.pipe(
deepSearchForRouteData<MyRouteData>((data) => !!data && Object.hasOwn(data, 'config')),
map((data) => data?.config),
distinctUntilChanged()
)
.subscribe(console.log);| import { | |
| ActivationEnd, | |
| NavigationCancel, | |
| NavigationEnd, | |
| NavigationError, | |
| NavigationStart, | |
| Route, | |
| Router, | |
| } from '@angular/router'; | |
| import { EMPTY, filter, map, race, switchMap, take } from 'rxjs'; | |
| export const deepSearchForRouteData = | |
| <T = Route['data']>(predicate: (data: T) => boolean) => | |
| (source: Router['events']) => { | |
| const skipData$ = source.pipe( | |
| filter((event) => event instanceof NavigationError || event instanceof NavigationCancel), | |
| take(1), | |
| switchMap(() => EMPTY) | |
| ); | |
| const emptyData$ = source.pipe( | |
| filter((event) => event instanceof NavigationEnd), | |
| take(1), | |
| map(() => undefined) | |
| ); | |
| const lastData$ = source.pipe( | |
| filter((event): event is ActivationEnd => event instanceof ActivationEnd), | |
| filter((event) => event.snapshot.outlet === 'primary'), | |
| map((event) => event.snapshot.data as T), | |
| filter(predicate), | |
| take(1) | |
| ); | |
| return source.pipe( | |
| filter((event) => event instanceof NavigationStart), | |
| switchMap(() => race([lastData$, emptyData$, skipData$])) | |
| ); | |
| }; |