
В предыдущей статье мы упоминали, что
сервис можно использовать не только для обработки API-запросов, но и для других целей
, например для реализации notification , о которых мы поговорим в этой статье. [Рекомендуемые соответствующие учебные пособия: «Учебное пособие по Angular»]
Визуализация выглядит следующим образом:

Пользовательский интерфейс можно будет настроить позже
, поэтому давайте разберем его шаг за шагом.
Чтобы добавить службу,
мы добавляем файл службы notification.service.ts в app/services (для его создания используйте командную строку) и добавляем соответствующий контент:
// Notification.service.ts
import {Injectable} из '@angular/core';
импортировать {Наблюдаемый, Тема} из 'rxjs';
// Перечисление статуса уведомления Export enum NotificationStatus {
Процесс = "прогресс",
Успех = «успех»,
Неудача = «неудача»,
Завершено = «закончено»
}
@Инъекционный({
предоставлено: 'корень'
})
класс экспорта NotificationService {
частное уведомление: Тема<NotificationStatus> = новая тема();
публичное сообщениеObj: любой = {
начальный: '',
вторичное: ''
}
// Преобразование в наблюдаемый public getNotification(): Observable<NotificationStatus> {
верните this.notify.asObservable();
}
// Уведомление выполняется public showProcessNotification() {
this.notify.next(NotificationStatus.Process)
}
// Уведомление об успехе public showSuccessNotification() {
this.notify.next(NotificationStatus.Success)
}
//Конец уведомления public showEndedNotification() {
this.notify.next(NotificationStatus.Ended)
}
// Изменяем информацию publicchangePrimarySecondary(primary?: string,вторичный?:string) {
this.messageObj.primary = основной;
this.messageObj.вторичный = вторичный
}
конструктор() { }
} Легко ли понять...
Мы превращаем notify в наблюдаемый объект, а затем публикуем различную информацию о статусе.
Чтобы создать компонент,
мы создаем новый компонент notification в app/components где хранятся общедоступные компоненты. Таким образом, вы получите следующую структуру:
уведомление ├── Notification.comComponent.html // Скелет страницы ├── Notification.comComponent.scss // Уникальный стиль страницы ├── Notification.comComponent.spec.ts // Тестовый файл └── Notification.comComponent.ts // В в файле javascript
мы определяем скелет notification :
<!-- Notification.comComponent.html -->
<!--Поддержка ручного закрытия уведомлений-->
<button (click)="closeNotification()">Закрыть</button>
<h1>Содержимое напоминания: {{ message }}</h1>
<!-- Настройка ключевой информации уведомления-->
<p>{{primaryMessage }}</p>
<!-- Настройте дополнительную информацию уведомления-->
<p>{{ SecondaryMessage }}</p> Далее мы просто изменяем скелет и добавляем следующий стиль:
// Notification.comComponent.scss
:хозяин {
положение: фиксированное;
верх: -100%;
справа: 20 пикселей;
цвет фона: #999;
граница: 1 пиксель, сплошная #333;
радиус границы: 10 пикселей;
ширина: 400 пикселей;
высота: 180 пикселей;
отступ: 10 пикселей;
// Обратите внимание на содержимое active. Оно появляется только при появлении уведомления &.active {.
верх: 10 пикселей;
}
&.успех{}
&.прогресс {}
&.отказ {}
&.закончено {}
} Четыре имени классов: success, progress, failure, ended соответствуют перечислению, определенному службой уведомлений. Вы можете добавить связанные стили в соответствии со своими предпочтениями.
Наконец, мы добавляем поведенческий код javascript .
// уведомление.компонент.ц
импортировать {Component, OnInit, HostBinding, OnDestroy} из '@angular/core';
//Новая точка знаний rxjs
импортировать {подписку} из 'rxjs';
импортируйте {debounceTime} из «rxjs/operators»;
//Внедрение связанных служб import { NotificationStatus, NotificationService } from 'src/app/services/notification.service';
@Компонент({
селектор: 'приложение-уведомление',
templateUrl: './notification.comComponent.html',
styleUrls: ['./notification.comComponent.scss']
})
класс экспорта NotificationComponent реализует OnInit, OnDestroy {
// Время защиты от встряхивания, только для чтения. Private readonly NOTIFICATION_DEBOUNCE_TIME_MS = 200;
защищенное уведомлениеПодписка!: Подписка;
частный таймер: любой = ноль;
публичное сообщение: строка = ''
// сопоставление службы уведомлений информации перечисления Private ReflectObj: Any = {
прогресс: «в процессе»,
успех: «успех»,
неудача: «неудача»,
закончилось: "конец"
}
@HostBinding('класс') NotificationCssClass = '';
общественное первичное сообщение!: строка;
общественное вторичное сообщение!: строка;
конструктор(
частная служба уведомлений: NotificationService
) { }
ngOnInit(): пустота {
это.инит()
}
общественная инициализация () {
//Добавляем соответствующую информацию о подписке this.notificationSubscription = this.notificationService.getNotification()
.трубка(
debounceTime(this.NOTIFICATION_DEBOUNCE_TIME_MS)
)
.subscribe((notificationStatus: NotificationStatus) => {
если (состояние уведомления) {
это.resetTimeout();
//Добавляем связанные стили this.notificationCssClass = `active ${ NotificationStatus }`
this.message = this.reflectObj[notificationStatus]
// Получаем собственное основное сообщение this.primaryMessage = this.notificationService.messageObj.primary;
// Получаем пользовательскую вторичную информацию this. SecondaryMessage = this.notificationService.messageObj. Secondary;
if(notificationStatus === NotificationStatus.Process) {
это.resetTimeout()
this.timer = setTimeout(() => {
это.resetView()
}, 1000)
} еще {
это.resetTimeout();
this.timer = setTimeout(() => {
this.notificationCssClass = ''
это.resetView()
}, 2000)
}
}
})
}
частный сбросView(): void {
это.сообщение = ''
}
// Закрываем таймер Private ResetTimeout(): void {
если (этот.таймер) {
ClearTimeout(this.timer)
}
}
// Закрытие уведомления public closeNotification() {
this.notificationCssClass = ''
это.resetTimeout()
}
// Компонент уничтожен ngOnDestroy(): void {
это.resetTimeout();
//Отменяем все сообщения о подписке this.notificationSubscription.unsubscribe()
}
} Здесь мы представляем суть rxjs . RxJS — это библиотека реактивного программирования, использующая Observables , которая упрощает написание асинхронного кода или кода на основе обратного вызова. Это отличная библиотека, и вы узнаете о ней больше в следующих нескольких статьях.
Здесь мы используем функцию предотвращения debounce . Функция anti-shake означает, что после запуска события оно может быть выполнено только один раз через n секунд. Если событие будет вызвано снова в течение n секунд, время выполнения функции будет равно. пересчитан. Проще говоря: когда действие запускается постоянно, выполняется только последний раз.
ps: функция
throttle: ограничить выполнение функции только один раз в течение определенного периода времени .
Во время интервью интервьюер любит спрашивать...
Вызов
Поскольку это глобальный сервис, мы вызываем этот компонент в app.component.html :
// app.comComponent.html <роутер-выход></роутер-выход> <app-notification></app-notification>
Чтобы облегчить демонстрацию, мы добавляем кнопку в user-list.component.html , чтобы легко запустить демонстрацию:
// user-list.comComponent.html <button (click)="showNotification()">нажмите показать уведомление</button>
запускает соответствующий код:
// user-list.comComponent.ts
импортировать { NotificationService } из «src/app/services/notification.service»;
// ...
конструктор(
частная служба уведомлений: NotificationService
) { }
//Показать уведомление showNotification(): void {
this.notificationService.changePrimarySecondary('Основная информация 1');
this.notificationService.showProcessNotification();
setTimeout(() => {
this.notificationService.changePrimarySecondary('Основная информация 2', 'Вторичная информация 2');
this.notificationService.showSuccessNotification();
}, 1000)
} На этом мы закончили, мы успешно смоделировали функцию notification . Мы можем модифицировать связанные сервисные компоненты в соответствии с реальными потребностями и настроить их в соответствии с потребностями бизнеса. Если мы разрабатываем систему для внутреннего использования, рекомендуется использовать зрелые библиотеки пользовательского интерфейса. Они помогли нам инкапсулировать различные компоненты и сервисы, сэкономив нам много времени на разработку.