Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show activity Indicator while loading a lazy loaded Module in Angular 2

My scenario is as follows. I have a menu, with multiple options. Each menu should be shown depending on user permissions (already solved), most menu items are encapsulated as modules, and most of the modules are lazy loaded, so when a user clicks a menu item the first time, it loads (up to here everything works well), now my requirement is, in order to give a better user experience, I need to show activity indicator after user clicks a menu item while the lazy loaded module is loading.

Up to this, I tried using canActive, canLoad, canActivateChild interfaces from Angular Router but with no luck.

Any ideas?

like image 903
vicmac Avatar asked Mar 23 '17 15:03

vicmac


People also ask

How do I know if Angular lazy loading is working?

If you want to check how lazy loading works and how lazy loading routing flow, then Augury is the best tool we have. Click on ctrl+F12 to enable the debugger and click on the Augury tab. Click on the router tree. Here, it will show the route flow of our modules.

How do you do lazy loading in angular 2?

To lazy load Angular modules, use loadChildren (instead of component ) in your AppRoutingModule routes configuration as follows. content_copy const routes: Routes = [ { path: 'items', loadChildren: () => import('./items/items. module'). then(m => m.

What is lazy loading and enable lazy loading in angular 2?

Angular 2 Lazy loading a module With lazy loading our application does not need to load everything at once, it only needs to load what the user expects to see when the app first loads. Modules that are lazily loaded will only be loaded when the user navigates to their routes.

How is lazy loading achieved in Angular?

Lazy loading is a technique in Angular that allows you to load JavaScript components asynchronously when a specific route is activated. It improves the speed of the application load time by splitting the application into several bundles. When the user navigates through the app, the bundles are loaded as required.


2 Answers

You can listen for two router events:

  • RouteConfigLoadStart
  • RouteConfigLoadEnd

They fire when a lazy loaded module is being loaded. The advantage of using these over the standard router events such as NavigationStart is that they won't fire on every route change.

Listen to them in your root AppComponent to show / hide your spinner.

app.component.ts

import { Router, RouteConfigLoadStart, RouteConfigLoadEnd } from '@angular/router';  ...  export class AppComponent implements OnInit {      loadingRouteConfig: boolean;      constructor (private router: Router) {}      ngOnInit () {         this.router.events.subscribe(event => {             if (event instanceof RouteConfigLoadStart) {                 this.loadingRouteConfig = true;             } else if (event instanceof RouteConfigLoadEnd) {                 this.loadingRouteConfig = false;             }         });     } } 

app.component.html

Just a simple string here, but you could use a spinner component.

<router-outlet></router-outlet>  <ng-container *ngIf="loadingRouteConfig">Loading route config...</ng-container> 

I'm using this approach with Angular v4.2.3

like image 139
Daniel Crisp Avatar answered Oct 07 '22 19:10

Daniel Crisp


you can do it like this

  1. in app.component.html
<div class="main-loader" *ngIf="loading">   <div class="cssload-container" >       <div class="cssload-whirlpool"></div>   </div> </div> 
  1. in app.component.ts

    import { Router, NavigationStart, NavigationEnd } from '@angular/router';   loading:boolean = false; constructor(private router:Router) {    router.events.subscribe(event => {     if(event instanceof NavigationStart) {       this.loading = true;       console.log("event started")     }else if(event instanceof NavigationEnd) {       this.loading = false;       console.log("event end")     }     // NavigationEnd     // NavigationCancel     // NavigationError     // RoutesRecognized   });  } 
  2. in css any loading animation

hope this is useful to you. thanks

like image 34
tanveer ahmad dar Avatar answered Oct 07 '22 17:10

tanveer ahmad dar