Introduction
In this article, we will learn how we can show the Loader in Angular 11 without using any third-party spinner. We are using CSS to build an animated Spinner.
Prerequisites
- Basic Knowledge of Angular 2 or higher
- Visual Studio Code
- Node and NPM installed
- Bootstrap
Step 1
Create an Angular project by using the following command
ng new Angularloader
Step 2
Open this project in Visual Studio Code and install bootstrap by using the following command
npm install bootstrap --save
Jquery is needed to run bootstrap click events. So install jquery using below command
npm install jquery --save
Declare Jquery before bootstrap.
Otherwise, you will get the below error
Uncaught TypeError: Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.
- "scripts": [
- "node_modules/jquery/dist/jquery.js",
- "node_modules/bootstrap/dist/js/bootstrap.js"]
Now Bootstrap will work fine.
Step 4
- Let's start the main goal of the articlet to show spinner.
- Create one new component using Ng g c popuploader
- In popuploader.component.css file paste below lines of code to create animated spinner
- .loadWrapper {
- background: rgba(0, 0, 0, 0.3);
- width: 100 % ;
- height: 100 % ;
- position: fixed;
- top: 0 px;
- left: 0 px;
- z - index: 99999;
- }.loader {
- border: 5 px solid #f3f3f3;
- border - top: 5 px solid #3d3e3f;
- position: absolute;
- left: 50%;
- top: 50%;
- border-radius: 50%;
- width: 50px;
- height: 50px;
- animation: spin 2s linear infinite;
- }
- @keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
- }
Step 5
We will create one simple data service which will load data into table..For that I have created student.service.ts file
In StudentService write the below line of code.
- import {
- Injectable
- } from '@angular/core';
- @Injectable({
- providedIn: 'root'
- })
- export class StudentService {
- students = [{
- "id": 1001,
- "name": "Irshad",
- "marks": 90
- }, {
- "id": 1002,
- "name": "Imran",
- "marks": 80
- }, {
- "id": 1003,
- "name": "Rahul",
- "marks": 70
- }, {
- "id": 1004,
- "name": "Ajay",
- "marks": 85
- }, {
- "id": 1005,
- "name": "Sunny",
- "marks": 60
- }];
- constructor() {}
- getStudents() {
- return this.students;
- }
- }
Step 6
Lets call this service in our popuploader component
- import {
- Component,
- OnInit
- } from '@angular/core';
- import {
- StudentService
- } from '../student.service';
- @Component({
- selector: 'app-popuploader',
- templateUrl: './popuploader.component.html',
- styleUrls: ['./popuploader.component.css']
- })
- export class PopuploaderComponent implements OnInit {
- public loading = true;
- public studentList: any[];
- constructor(private stnService: StudentService) {}
- ngOnInit() {
- this.loading = true;
- setTimeout(() => {
-
- this.studentList = this.stnService.getStudents();
- this.loading = false;
- }, 5000);
- }
- }
Step 7
You can seen I have created one variable loading this will decide whether loading spinner should show or not.
Before loading the data into variable I set as true .then the spinner will show.
- Then I given some time to show the spinner.
- After that I set to False to hide the spinner. As I mentioned no need of timer when API. Call.
- Once API call over set it as false.
Step 6
Let's create a Model dialog with the help of Bootstrap and call the data & spinner.
- <!-- Button to Open the Modal -->
- <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">
- Open modal
- </button>
- <!-- The Modal -->
- <div class="modal" id="myModal">
- <div class="modal-dialog">
- <div class="modal-content">
- <!-- Modal Header -->
- <div class="modal-header">
- <h4 class="modal-title">popuploader</h4>
- <button type="button" class="close" data-dismiss="modal">×</button>
- </div>
- <!-- Modal body -->
- <div class="modal-body">
- <div *ngIf="loading else loaded" class="loader"></div>
- <!-- Modal footer -->
- <div class="modal-footer">
- <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
- </div>
- </div>
- </div>
- </div>
- <ng-template #loaded>
- <p>student works!</p>
- <table class="table">
- <thead>
- <td>
- ID
- </td>
- <td>
- Name
- </td>
- <td>
- Marks
- </td>
- </thead>
- <tbody>
- <tr *ngFor="let std of studentList">
- <td>{{std.id}}</td>
- <td>{{std.name}}</td>
- <td>{{std.marks}}</td>
- </tr>
- </tbody>
- </table>
- </ng-template>
In about code, we have created one button. That button will trigger the popup.
We should call the popup using the data-target attribute data-target="#myModal".
Mymodel is the id of model dialog.
In our process, I will load the spinner with the timer. In real-life cases, no timer is needed.
I have created ng template and I have loaded the data there.
- <ng-template #loaded>
- …..
- </ng-template>
I gave the name of the template as loaded.
To show the templete I have set condition as,
- <div *ngIf="loading else loaded" class="loader">
- </div>
SO if loading variable is true then the loaded template will show with loader css.
If false then loader CSS will disappear
Now type ng serve to ( use angular CLI ) run the project.