اضافه کردن لودینگ به درخواست های http انگولار
ایجاد لودینگ برای درخواست های http در انگولار :
ng generate service services/loader --skipTests=true import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class LoaderService { public isLoading = new BehaviorSubject(false); constructor() { } }
ng generate service interceptors/loader-interceptor --skipTests=true import { Injectable } from '@angular/core'; import { HttpResponse, HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; import { Observable } from 'rxjs'; import { LoaderService } from '../services/loader.service'; @Injectable() export class LoaderInterceptor implements HttpInterceptor { private requests: HttpRequest<any>[] = []; constructor(private loaderService: LoaderService) { } removeRequest(req: HttpRequest<any>) { const i = this.requests.indexOf(req); if (i >= 0) { this.requests.splice(i, 1); } this.loaderService.isLoading.next(this.requests.length > 0); } intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { this.requests.push(req); console.log("No of requests--->" + this.requests.length); this.loaderService.isLoading.next(true); return Observable.create(observer => { const subscription = next.handle(req) .subscribe( event => { if (event instanceof HttpResponse) { this.removeRequest(req); observer.next(event); } }, err => { alert('error' + err); this.removeRequest(req); observer.error(err); }, () => { this.removeRequest(req); observer.complete(); }); // remove request from queue when cancelled return () => { this.removeRequest(req); subscription.unsubscribe(); }; }); } }
ng generate component components/my-loader --skipTests=true <!-- my-loader.component.html --> <div class="progress-loader" [hidden]="!loading"> <div class="loading-spinner"> <img src="https://loading.io/mod/spinner/gear-set/index.svg"> <span class="loading-message">Please wait...</span> </div> </div> * my-loader.component.css */ .loading-spinner{ background-color: #0000001f; position: absolute; width: 100%; top: 0px; left: 0px; height: 100vh; align-items: center; justify-content: center; display: grid; } .loading-spinner img{ align-self: end; } .loading-message{ text-align: center; align-self: start; } // my-loader.component.ts import { Component, OnInit } from '@angular/core'; import { LoaderService } from '../../services/loader.service'; @Component({ selector: 'app-my-loader', templateUrl: './my-loader.component.html', styleUrls: ['./my-loader.component.css'] }) export class MyLoaderComponent implements OnInit { loading: boolean; constructor(private loaderService: LoaderService) { this.loaderService.isLoading.subscribe((v) => { console.log(v); this.loading = v; }); } ngOnInit() { } }
بعد کامپوننت رو در جای مناسب قرار بدی و داخل app.module هم اینارو میزاریم :
providers: [ LoaderService, { provide: HTTP_INTERCEPTORS, useClass: LoaderInterceptor, multi: true } ],