
1. Введение
Загрузка важна для веб-сайта, она может сообщить пользователю, что поток обрабатывается, иначе пользователь не будет знать, что происходит. Итак, я представлю отличный пакет загрузки, который поможет вам решить проблему с загрузкой!
2. ngx-загрузка
ngx-loading — это очень красивый и настраиваемый индикатор загрузки для Angular. Имеются гибкие параметры конфигурации, которые позволяют настраивать различные стили загрузки. Вы можете установить ngx-loading с помощью команды ниже:
Хотите хорошо торговать в cTrader? ›› ПОПРОБУЙТЕ! ‹‹
npm install --save ngx-loading
И вы можете найти использование базы в github.
3. Использование в общей раскладке
При обычном использовании вам необходимо добавить приведенный ниже код на каждую страницу html, поэтому в этой статье я покажу вам, как использовать ngx-loading в обычном макете.
<ngx-loading
[show]="loading"
[config]="{ backdropBorderRadius: '3px' }"
[template]="customLoadingTemplate"
></ngx-loading>
3.1. Создать сервис
Идея заключается в том, что мы поместим ngx-loading в макет HTML общей (или родительской) страницы, поэтому мы не сможем напрямую управлять им на дочерней странице. Решение состоит в том, что мы можем использовать Subject.
Subject — это особый тип Observable, который позволяет передавать значения многим наблюдателям. Субъекты похожи на EventEmitters.
Итак, мы можем создать службу для обработки Subject. Предположим, нам просто нужно управлять start и stop, чтобы показать необходимую загрузку, поэтому создайте эти два метода в сервисе и не забудьте освободить объект, полный код, как показано ниже:
import { Injectable, OnDestroy } from "@angular/core";
import { Subject } from "rxjs";
@Injectable({
providedIn: 'root',
})
export class LoadingService implements OnDestroy {
// Observable string sources
private emitChangeSource = new Subject<boolean>();
// Observable string streams
changeEmitted$ = this.emitChangeSource.asObservable();
// Start loading
start() {
this.emitChangeSource.next(true);
}
// Stop loading
stop() {
this.emitChangeSource.next(false);
}
ngOnDestroy() {
// complete and release the subject
this.emitChangeSource.complete();
}
}
3.2. Добавьте загрузку ngx в макет
1) Импортируйте NgxLoadingModule в корневой модуль приложения.
import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core";
import { CoreModule } from "./core/core.module";
import { NgxLoadingModule } from "ngx-loading";
@NgModule({
//...
imports: [
//...
NgxLoadingModule.forRoot({}),
],
//...
})
export class AppModule {}
2) Создайте флаг loading и настройте его в файле основного макета (.ts).
const PrimaryRed = '#dd0031';
const SecondaryBlue = '#1976d2';
//...
//set the loading flag
loading = false;
//set the loading config
//reference: https://github.com/Zak-C/ngx-loading#config-options
config = {
animationType: ngxLoadingAnimationTypes.threeBounce,
primaryColour: PrimaryRed,
secondaryColour: SecondaryBlue,
tertiaryColour: PrimaryRed,
backdropBorderRadius: '3px',
};
3) Подпишитесь и обновляйте статус загрузки в основном макете.
// Update loading status
this.loadingService.changeEmitted$.subscribe(isLoading => {
//console.log(isLoading);
this.loading = isLoading;
});
4) Добавьте HTML-код загрузки в файл основного интерфейса макета (.html).
<ngx-loading #ngxLoading [show]="loading" [config]="config" [template]="loadingTemplate"></ngx-loading>
<ng-template #loadingTemplate>
<div class="loading-class">
<h4>Please wait ...</h4>
</div>
</ng-template>
Хорошо, теперь нам просто нужно управлять флагом loading на других дочерних страницах с помощью LoadingService.
4. Использование на дочерних страницах
Мы до сих пор используем этот код для демонстрации. Применяем загрузку при входе в систему, поэтому мы устанавливаем private loadingService: LoadingService в конструкторе компонента входа и вызываем this.loadingService.start(); после отправки формы входа, а затем вызываем this.loadingService.stop(); в случае успешного или неудачного входа:
constructor(//...
private loadingService: LoadingService) {
}
//login
login() {
//start the loading
this.loadingService.start();
this.auth
.login(this.username.value, this.password.value)
.pipe(filter(authenticated => authenticated))
.subscribe(
() => {
console.log('after logined and redirect');
//stop the loading
this.loadingService.stop();
this.router.navigateByUrl('/user-management');
},
(errorRes: HttpErrorResponse) => {
//stop the loading
this.loadingService.stop();
if(errorRes.status == 401){
//...
}
console.log('Error', errorRes);
}
);
}
После нажатия кнопки входа в систему отобразится загрузка, как показано ниже.

5. Вывод
Если мы хотим управлять родительским компонентом в дочернем компоненте, нам нужно подписаться на статус изменения и обновлять его в дочернем компоненте, чтобы мы могли использовать Subject и создать для этого сервис! Это та же концепция, что и в этой статье — использование SweetAlert2 в angular.
Если вам понравилась эта статья, подпишитесь на меня здесь, на Medium, чтобы узнавать больше историй о .Net Core, Angular и других технологиях! :)

Стеккадемический
Спасибо, что дочитали до конца. Прежде чем уйти:
- Пожалуйста, рассмотрите возможность аплодировать и следовать автору! 👏
- Следуйте за нами в Twitter(X), LinkedIn и YouTube.
- Посетите Stackademic.com, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.