Управление работой пользователей во время ожидания Http-запроса очень важно в одностраничных приложениях. Поскольку при асинхронных обращениях к серверу в браузере не происходит видимых изменений, пользователи, скорее всего, запутаются и в конечном итоге закроют ваше приложение из-за разочарования.
Я видел несколько статей в Интернете, показывающих, как этого добиться, расширив класс HttpClient. Как бы это ни звучало как хорошее решение, я считаю, что это перебор.
Поэтому я придумал что-то другое, что я делал несколько раз в дни Angular JS 1.x. Напишите простой перехватчик, который может перехватывать все вызовы, сделанные из HttpClient. Затем создайте методы «до» и «после» для обработки отправления и прибытия рейса :-).
Итак, нам нужно создать файл, я назову свой app.interceptor.ts.
/** * Created by akin.akindolani on 12/5/17. */ import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpResponse, HttpEvent, HttpErrorResponse, HttpInterceptor } from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; declare var $:any; @Injectable() export class AppInterceptor implements HttpInterceptor { constructor() {} intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { this.showBusyLoader(); return next.handle(request).do((event: HttpEvent<any>) => { if (event instanceof HttpResponse) { this.hideBusyLoader(); } }, (error: any) => { if (error instanceof HttpErrorResponse) { this.hideBusyLoader(); } }); } showBusyLoader() { //Show Loader. } hideBusyLoader() { //Hide Loader } }
Обратите внимание, что $ был объявлен. Это означает, что любители jQuery могут реализовать функции jQuery для плавного появления или исчезновения элемента в зависимости от обстоятельств.
Далее нужно добавить это в наш список поставщиков в app.module.ts.
import { BrowserModule } from '@angular/platform-browser'; import { NgModule, CUSTOM_ELEMENTS_SCHEMA,NO_ERRORS_SCHEMA } from '@angular/core'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { AppInterceptor } from './app.interceptor'; @NgModule({ schemas: [ CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA ], declarations: [...], imports: [...], providers: [{ provide: HTTP_INTERCEPTORS, useClass: AppInterceptor, multi: true }], bootstrap: [AppComponent] }) export class AppModule { }
И это все. Запустите свое приложение, чтобы увидеть его в действии.
Наслаждаться!