docs/en/framework/ui/angular/router-events.md
//[doc-seo]
{
"Description": "Learn how to simplify router event handling in Angular with `RouterEvents`, making your code cleaner and more efficient."
}
RouterEvents is a utility service for filtering specific router events and reacting to them. Please see this page in Angular docs for available router events.
You can use router events directly and filter them as seen below:
import {
NavigationEnd,
NavigationError,
NavigationCancel,
Router,
} from '@angular/router';
import { filter } from 'rxjs/operators';
import { inject, Injectable } from '@angular/core';
@Injectable()
class SomeService {
private router = inject(Router);
navigationFinish$ = this.router.events.pipe(
filter(
event =>
event instanceof NavigationEnd ||
event instanceof NavigationError ||
event instanceof NavigationCancel,
),
);
/* Observable<Event> */
}
However, RouterEvents makes filtering router events easier.
import { RouterEvents } from '@abp/ng.core';
@Injectable()
class SomeService {
private routerEvents = inject(RouterEvents);
navigationFinish$ = this.routerEvents.getNavigationEvents('End', 'Error', 'Cancel');
/* Observable<NavigationCancel | NavigationEnd | NavigationError> */
}
RouterEvents also delivers improved type-safety. In the example above, navigationFinish$ has inferred type of Observable<NavigationCancel | NavigationEnd | NavigationError> whereas it would have Observable<Event> when router events are filtered directly.
You do not have to provide RouterEvents at the module or component level, because it is already provided in root. You can inject and start using it immediately in your components.
You can use getNavigationEvents to get a stream of navigation events matching given event keys.
import { RouterEvents } from '@abp/ng.core';
import { merge } from 'rxjs';
import { mapTo } from 'rxjs/operators';
@Injectable()
class SomeService {
private routerEvents = inject(RouterEvents);
navigationStart$ = this.routerEvents.getNavigationEvents('Start');
/* Observable<NavigationStart> */
navigationFinish$ = this.routerEvents.getNavigationEvents('End', 'Error', 'Cancel');
/* Observable<NavigationCancel | NavigationEnd | NavigationError> */
loading$ = merge(
this.navigationStart$.pipe(mapTo(true)),
this.navigationFinish$.pipe(mapTo(false)),
);
/* Observable<boolean> */
}
You can use getAllNavigationEvents to get a stream of all navigation events without passing any keys.
import { RouterEvents, NavigationStart } from '@abp/ng.core';
import { map } from 'rxjs/operators';
@Injectable()
class SomeService {
private routerEvents = inject(RouterEvents);
navigationEvent$ = this.routerEvents.getAllNavigationEvents();
/* Observable<NavigationCancel | NavigationEnd | NavigationError | NavigationStart> */
loading$ = this.navigationEvent$.pipe(
map(event => event instanceof NavigationStart),
);
/* Observable<boolean> */
}
You can use previousNavigation and currentNavigation properties to retrieve navigations in a reactive way.
previousNavigation: Signal<string>;
currentNavigation: Signal<string>;
import { RouterEvents } from "@abp/ng.core";
@Injectable()
class SomeService {
readonly routerEvents = inject(RouterEvents);
someAction() {
const previousNavUrl = this.routerEvents.previousNavigation();
if (previousNavUrl) {
// perform some action
}
}
}
You can use getEvents to get a stream of router events matching given event classes.
import { RouterEvents } from '@abp/ng.core';
import { ActivationEnd, ChildActivationEnd } from '@angular/router';
@Injectable()
class SomeService {
private routerEvents = inject(RouterEvents);
moduleActivation$ = this.routerEvents.getEvents(ActivationEnd, ChildActivationEnd);
/* Observable<ActivationEnd | ChildActivationEnd> */
}
You can use getEvents to get a stream of all router events without passing any event classes. This is nothing different from accessing events property of Router and is added to the service just for convenience.
import { RouterEvents } from '@abp/ng.core';
import { ActivationEnd, ChildActivationEnd } from '@angular/router';
@Injectable()
class SomeService {
private routerEvents = inject(RouterEvents);
routerEvent$ = this.routerEvents.getAllEvents();
/* Observable<Event> */
}