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

Почти в каждом приложении 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 .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.