Два проверенных метода улучшения пользовательского опыта

Почти в каждом приложении Angular есть счетчик загрузки. Когда пользователь выполняет действие, которое запускает длительную задачу, например HTTP-запрос, счетчик загрузки может предоставить пользователю визуальную обратную связь о том, что приложение работает над запросом.
Когда пользователь видит счетчик, его мозг настроен на то, что задача будет выполнена в ближайшее время, что сокращает время ожидания. Другими словами, это помогает улучшить воспринимаемую производительность.
В этой статье мы обсудим два способа показать счетчик в приложении Angular: с помощью наложения и с помощью шаблона.
Реализовать оверлейный счетчик с глобальным перехватчиком
Один из способов показать счетчик загрузки — использовать наложение. Оверлей — это прозрачный контейнер, который отображается поверх существующего содержимого и занимает весь экран. Он обычно используется для блокировки пользователей от взаимодействия со страницей.
Во-первых, давайте создадим SpinnerService.
@Injectable({
providedIn: 'root',
})
export class SpinnerService {
public loading$: Observable<boolean>;
private _loading$: BehaviorSubject<boolean> = new BehaviorSubject(false);
public constructor() {
this.loading$ = this._loading$.asObservable();
}
set(loading: boolean) {
this._loading$.next(loading);
}
}
В SpinnerService мы создали частное свойство _loading$ как BehaviorSubject, что позволяет передавать текущее значение новым подписчикам и отслеживать последнее переданное значение. Сервис предоставляет следующие
- наблюдаемый
loading$, на который можно подписаться. Setметод, позволяющий изменять состояние загрузки.
Затем мы можем создать компонент счетчика, используя счетчик материала.
<div *ngIf="isLoading$ | async" class="main-container">
<div class="loading-container">
<mat-spinner color="warn"></mat-spinner>
</div>
</div>
// Component class
export class OverlaySpinnerComponent{
isLoading$ = this.spinnerService.loading$;
constructor(public spinnerService: SpinnerService) {}
}
Шаблон компонента содержит элемент счетчика Material Design <mat-spinner> с цветом warn. В классе компонента мы определили свойство isLoading$ , которому присваивается значение свойства loading$ из файла spinnerService. Эта служба внедряется в конструктор и используется для отслеживания состояния загрузки приложения.
Чтобы создать наложение в Angular, мы можем использовать CSS для форматирования компонента счетчика.
.loading-container {
position: absolute;
top: 0;
left: 0;
bottom: 56px;
right: 0;
background: rgba(0, 0, 0, 0.15);
z-index: 99;
display: flex;
align-items: center;
justify-content: center;
}
Ключом к этому подходу является перехватчик. Служба ApiInterceptor перехватывает все HTTP-запросы и ответы и устанавливает для состояния загрузки значение true перед отправкой запроса и значение false, когда ответ получен через SpinnerService. Это позволяет нам показывать и скрывать счетчик загрузки в зависимости от состояния HTTP-запросов приложения.
@Injectable()
export class ApiInterceptor implements HttpInterceptor {
constructor(private spinnerService: SpinnerService) {}
intercept(
request: HttpRequest<unknown>,
next: HttpHandler
): Observable<HttpEvent<unknown>> {
this.spinnerService.set(true);
return next.handle(request).pipe(
finalize(() => {
this.spinnerService.set(false);
})
);
}
}
Служба-перехватчик должна быть зарегистрирована в AppModule, чтобы быть эффективной.
//app.module.ts
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: ApiInterceptor,
multi: true,
},
]
Наконец, мы готовы использовать только что созданный счетчик.
<div>
<button (click)="load()">Click here to show overlay spinner</button>
<app-overlay-spinner></app-overlay-spinner>
</div>
// OverlayDemoComponent
export class OverlayDemoComponent{
public data: any;
constructor(private apiService: ApiService) {}
load() {
this.apiService.getData().subscribe((data) => {
this.data = data;
});
}
}
Счетчик загрузки будет отображаться при запуске вызова API.

Спиннер на основе шаблона с Observable
Другой подход к отображению счетчика загрузки в Angular — использование шаблона. Шаблон — это фрагмент HTML, отображаемый внутри компонента или директивы.
Чтобы создать шаблон для счетчика загрузки, директива ng-template используется для определения шаблона, а директива *ngIf предназначена для отображения или скрытия шаблона на основе логического значения.
Вот пример использования шаблона для счетчика загрузки.
<div>
<button (click)="load()">Click here to show spinner</button>
<app-loading-spinner *ngIf="loading$ | async; else contentBlock"></app-loading-spinner>
<ng-template #contentBlock>
<div>
<h4>Content loaded</h4>
</div>
</ng-template>
</div>
// LoadingSpinnerDemoComponent
export class LoadingSpinnerDemoComponent{
loading$ = new BehaviorSubject<boolean>(false);
load() {
// simulate a service call
this.loading$.next(true);
setTimeout(() => {
this.loading$.next(false);
}, 3000);
}
}
Класс LoadingSpinnerDemoComponent содержит наблюдаемый объект loading$ для отображения и скрытия счетчика загрузки. Метод load() используется для моделирования вызова службы и обновляет значение loading$.
В шаблоне LoadingSpinnerDemoComponent мы используем компонент app-loading-spinner для отображения счетчика. Мы можем продолжать использовать счетчик материалов или использовать другие методы, включая классный шрифт или пользовательский CSS. Ниже приведены несколько примеров.
<!-- material design spinner --> <div style="display: flex; justify-content: center"> <mat-spinner color="info"></mat-spinner> </div> <!-- fontawesome style --> <div style="display: flex; justify-content: center"> <div class="fa fa-spinner fa-spin fa-3x fa-fw margin-bottom" style="line-height: 100px"></div> <div class="fa fa-refresh fa-spin fa-3x fa-fw margin-bottom" style="line-height: 100px"></div> <div class="fa fa-cog fa-spin fa-3x fa-fw margin-bottom" style="line-height: 100px"></div> </div>
Спиннер будет выглядеть так

Метод на основе шаблона — мой предпочтительный подход. Это простое и гибкое приложение, позволяющее отображать и скрывать часть страницы или всю страницу.
Краткое содержание
Таким образом, мы рассмотрели два метода отображения счетчика загрузки в приложении Angular: использование наложения и использование шаблона.
Однако есть много других способов реализовать счетчик загрузки в Angular, например, использование сторонней библиотеки или создание пользовательской директивы. Важно выбрать метод, который наилучшим образом соответствует потребностям и стилю вашего приложения. Вы можете получить доступ к примеру кода, упомянутому в этой статье здесь.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .
Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.