Skip to content

Instantly share code, notes, and snippets.

@ovcharik
Last active March 18, 2025 09:02
Show Gist options
  • Save ovcharik/5050f4b375ce29b2962af9313f3da5b4 to your computer and use it in GitHub Desktop.
Save ovcharik/5050f4b375ce29b2962af9313f3da5b4 to your computer and use it in GitHub Desktop.
Search route data in angular router events

Поиск данных в роутах Angular на основе событий роутера

Пример:

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$]))
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment