How do I detect user navigating back in Angular2?
AngularTypescriptAngular2 RoutingAngular Problem Overview
I have a component and I need to detect if user pressed back button in his browser to navigate back.
Currently I'm subscribing router events.
constructor(private router: Router, private activatedRoute: ActivatedRoute) {
this.routerSubscription = router.events
.subscribe(event => {
// if (event.navigatesBack()) ...
});
}
I know that I can use window.onpopstate
but it feels like a hack when using Angular2.
Angular Solutions
Solution 1 - Angular
EDIT Please don't do this.
The official docs say "This class should not be used directly by an application developer. Instead, use Location." Ref: https://angular.io/api/common/PlatformLocation
It's possible to use PlatformLocation
which has onPopState
listener.
import { PlatformLocation } from '@angular/common'
(...)
constructor(location: PlatformLocation) {
location.onPopState(() => {
console.log('pressed back!');
});
}
(...)
Solution 2 - Angular
IMO better method of listenting for popstate events is to subscribe to location service
import {Location} from "@angular/common";
constructor(private location: Location) { }
ngOnInit() {
this.location.subscribe(x => console.log(x));
}
It doesn't use PlatformLocation directly (as documentation suggest) and you can unsubscribe any time you want.
Solution 3 - Angular
import { HostListener } from '@angular/core';
and then listen for popstate
on the window
object:
@HostListener('window:popstate', ['$event'])
onPopState(event) {
console.log('Back button pressed');
}
This code works for me on latest Angular 2.
Solution 4 - Angular
As thorin87 answer dont use PlatformLocation. We need subscribe an unsubscribe.
import {Subscription} from 'rxjs/Subscription';
ngOnInit() {
this.subscription = <Subscription>this
.location
.subscribe(() => x => console.log(x));
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
Solution 5 - Angular
in angular 8+
constructor(private readonly route: Router) {
this.route.events
.pipe(filter((event) => event instanceof NavigationStart))
.subscribe((event: NavigationStart) => {
if (event.restoredState) {
this.isBackUrl = true;
}
});
}
Solution 6 - Angular
This solution works for all versions of Angular.
import { PlatformLocation } from'@angular/common';
constructor( private _location: PlatformLocation ) {
this._location.onPopState (() => {
`enter code here` // You could write code to display a custom pop-up here.
// window.location.href = 'https://www.google.com'; //Navigate to another location when the browser back is clicked.
});