Вы должны создать перехватчик для этой цели.Это мое:
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { LoaderService } from './loader.service';
import { HttpService } from '../shared/http.service';
@Injectable()
export class LoaderInterceptor implements HttpInterceptor {
private currentRequests: number;
constructor(
private _loaderService: LoaderService,
private _httpService: HttpService) {
this.currentRequests = 0;
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (this._httpService.ukljuciLoader) {
if (this._loaderService.autoloader) {
this.incrementRequestCount();
}
return next.handle(request)
.pipe(
tap((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
if (this._loaderService.autoloader) {
this.decrementRequestCount();
}
}
}, (err: any) => {
if (this._loaderService.autoloader) {
this.currentRequests = 0;
this._loaderService._toggleLoader.emit(false);
}
})
);
} else {
return next.handle(request);
}
}
private decrementRequestCount() {
if (--this.currentRequests === 0) {
this._loaderService._toggleLoader.emit(false);
}
}
private incrementRequestCount() {
if (this.currentRequests++ === 0) {
this._loaderService._toggleLoader.emit(true);
}
}
}
export const LoaderInterceptorProvider = {
provide: HTTP_INTERCEPTORS,
useClass: LoaderInterceptor,
multi: true
};
Это html:
<div class="loader-wrapper" *ngIf="loader">
<div class="loader"></div>
</div>
и это ts файл:
import { Component, OnInit, OnDestroy } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { LoaderService } from './loader.service';
@Component({
selector: 'app-loader',
templateUrl: './loader.component.html'
})
export class LoaderComponent implements OnInit, OnDestroy {
private ngUnsubscribe: Subject<any> = new Subject();
public loader = false;
constructor(
private _loaderService: LoaderService
) { }
ngOnInit() {
this._loaderService._toggleLoader
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe(
res => {
setTimeout(() => { this.loader = res; });
});
}
ngOnDestroy() {
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
}
Служба загрузчика:
import { Injectable, EventEmitter } from '@angular/core';
@Injectable()
export class LoaderService {
public autoloader = true;
public _toggleLoader: EventEmitter<any>;
constructor() {
this._toggleLoader = new EventEmitter<any>();
}
toggleLoader(toggle: boolean) {
this._toggleLoader.emit(toggle);
}
}
модуль приложения
....
import { LoaderInterceptor, LoaderInterceptorProvider } from './loader/loader.interceptor';
@NgModule({
declarations: [
...
],
imports: [
...
LoaderModule,
...
],
providers: [
...
LoaderInterceptorProvider,
...
}
],
entryComponents: [..],
bootstrap: [AppComponent]
})
export class AppModule {
}
finnaly css
.loader-wrapper {
position: fixed !important;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-position: center center;
background-color: rgba(255, 255, 255, 1);
z-index: 9998;
}
.loader {
position: relative;
left: 50%;
top: 50%;
height: 20vw;
width: 20vw;
margin: -10vw 0 0 -10vw;
border: 3px solid transparent;
border-top-color: #3498db;
border-bottom-color: #3498db;
border-radius: 50%;
z-index: 2;
-webkit-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
}
.loader:before {
content: "";
position: absolute;
top:2%;
bottom: 2%;
left: 2%;
right: 2%;
border: 3px solid transparent;
z-index: 2;
border-top-color: #db213a;
border-radius: 50%;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
}
.loader:after {
content: "";
position: absolute;
top:5%;
bottom: 5%;
left: 5%;
right: 5%;
border: 3px solid transparent;
border-top-color: #dec52d;
z-index: 2;
border-radius: 50%;
-webkit-animation: spin 1.5s linear infinite;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
/*Keyframes for spin animation */
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg); /* IE 9 */
transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */
}
50% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(180deg); /* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */
}
}
@-moz-keyframes spin {
0% {
-webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg); /* IE 9 */
transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */
}
50% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(180deg); /* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */
}
}
@-o-keyframes spin {
0% {
-webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg); /* IE 9 */
transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */
}
50% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(180deg); /* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(0deg); /* IE 9 */
transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */
}
50% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(180deg); /* Firefox 16+, IE 10+, Opera */
}
100% {
-webkit-transform: rotate(360deg); /* Chrome, Opera 15+, Safari 3.1+ */
-ms-transform: rotate(360deg); /* IE 9 */
transform: rotate(360deg); /* Firefox 16+, IE 10+, Opera */
}
}
Когда вы не хотите запускать загрузчик
Это мой http.service:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Url } from './global';
export interface IRequestOptions {
headers?: HttpHeaders;
observe?: 'body';
params?: HttpParams;
reportProgress?: boolean;
responseType?: 'json';
withCredentials?: boolean;
body?: any;
}
export function httpServiceCreator(http: HttpClient) {
return new HttpService(http);
}
@Injectable()
export class HttpService {
ukljuciLoader: boolean;
public constructor(public http: HttpClient) {
// If you don't want to use the extended versions in some cases you can access the public property and use the original one.
// for ex. this.httpClient.http.get(...)
}
public get<T>(url: string, options?: IRequestOptions, loader: boolean = true): Observable<T> {
this.ukljuciLoader = loader;
return this.http.get<T>(Url + url, options);
}
public post<T>(url: string, params: Object, options?: IRequestOptions, loader: boolean = true): Observable<T> {
this.ukljuciLoader = loader;
return this.http.post<T>(Url + url, params, options);
}
public put<T>(url: string, params: Object, options?: IRequestOptions, loader: boolean = true): Observable<T> {
this.ukljuciLoader = loader;
return this.http.put<T>(Url + url, params, options);
}
public delete<T>(url: string, options?: IRequestOptions, loader: boolean = true): Observable<T> {
this.ukljuciLoader = loader;
return this.http.delete<T>(Url + url, options);
}
}
export const HttpServiceProvider = {
provide: HttpService,
useFactory: httpServiceCreator,
deps: [HttpClient]
};
И это вызов, когда я хочу запустить загрузчик:
someCall( userid: number) {
let bodyString = JSON.stringify(userid: userid );
let headers = new HttpHeaders({ 'Content-Type': 'application/JSON' });
return this._http.post<any>('serverapi/spme call', bodyString, { headers: headers });
}
Это когда я не хочу запускать загрузчик:
someCall( userid: number) {
let bodyString = JSON.stringify(userid: userid );
let headers = new HttpHeaders({ 'Content-Type': 'application/JSON' });
return this._http.post<any>('serverapi/spme call', bodyString, { headers: headers }, false);
}