DEV Community

loading...
Stack Labs

Angular Router • Popstate blocked

pleasemorecoffee profile image PleaseMoreCoffee Updated on ・1 min read

There is my solution to block the popstate event in Angular world.

import { Location } from '@angular/common';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  constructor(
    private location: Location,
    private router: Router
  ) {
    this.router.events
      .pipe(
        filter(
          (event: NavigationStart) => event.navigationTrigger === 'popstate'
        )
      )
      .subscribe(() => {
        this.router.navigateByUrl(this.router.url);
        this.location.go(this.router.url);
      });
  }
}
Enter fullscreen mode Exit fullscreen mode

How it works ?

First of all, listen router events and filter on navigationTrigger (only NavigationStart). If "popstate" value, apply the logic.

Wait, why two actions ? 🤔

this.router.navigateByUrl(this.router.url);
Enter fullscreen mode Exit fullscreen mode

Angular navigates on the last route without reloading the page (no guards triggered again)

But browser perform real navigation !
If you click again on back button, browser navigation continues

How to freeze browser URL when popstate ?

this.location.go(this.router.url);
Enter fullscreen mode Exit fullscreen mode

location.go method rewrite browser URL WITHOUT reloading the page.

ENJOY !! 🔥🚀

Discussion (0)

pic
Editor guide