angularangular2-routingangular2-providers

Angular: How to globally listen to router events


I want to show a spinner whenever navigation occurs. How can I listen to router events globally so that I can show spinner on NavigationStart and hide it on NavigationEnd whenever routing occurs, like how we do with HttpInterceptor for globally intercepting requests.

Please give me some suggestions.


Solution

  • This is what I use:

    import { Component } from '@angular/core';
    import { Router, Event, NavigationStart, NavigationEnd, NavigationError, NavigationCancel } from '@angular/router';
    
    @Component({
        selector: 'mh-root',
        templateUrl: './app.component.html',
        styleUrls: ['./app.component.css']
    })
    export class AppComponent {
        loading: boolean = true;
    
        constructor(private router: Router) {
            router.events.subscribe((routerEvent: Event) => {
                this.checkRouterEvent(routerEvent);
            });
        }
    
        checkRouterEvent(routerEvent: Event): void {
            if (routerEvent instanceof NavigationStart) {
                this.loading = true;
            }
    
            if (routerEvent instanceof NavigationEnd ||
                routerEvent instanceof NavigationCancel ||
                routerEvent instanceof NavigationError) {
                this.loading = false;
            }
        }
    }