Автор оригинала: Balázs Tápai.
Воспроизведение Отказ Слово, которое пересекло мой разум несколько раз недавно, работая над угловым проектом. Я решил создать свои собственные угловые руологические материалы и блог о опыте.
Итак, что именно загрузка-индикатор? Обычно это спиннер какой-то сортировки с наложением, который предотвращает взаимодействие пользователя. Уэй не кликабели, а фокус попал в ловушку. Следовательно, пользователь не может случайно изменять данные или состояние приложения, взаимодействуя с входами за наложением.
После остановки загрузки наложение со спинном удаляется из DOM и ранее фокусированный элемент снова сосредоточен.
Я начал с логики, которая будет вызвать спиннер. Для этого я использовал простой поведение и два функции декоратора:
import {BehaviorSubject} from 'rxjs'; import {distinctUntilChanged} from 'rxjs/operators'; const indicatorSubject = new BehaviorSubject(false); export const isLoading$ = indicatorSubject.asObservable().pipe(distinctUntilChanged()); export function startLoadingIndicator(target: any, propertyKey: string | symbol, propertyDescriptor: PropertyDescriptor): any { const original = propertyDescriptor.value; propertyDescriptor.value = (...args) => { indicatorSubject.next(true); const result = original.call(target, ...args); return result; }; return propertyDescriptor; } export function stopLoadingIndicator(target: any, propertyKey: string, propertyDescriptor: PropertyDescriptor): any { const original = propertyDescriptor.value; propertyDescriptor.value = (...args) => { indicatorSubject.next(false); const result = original.call(target, ...args); return result; }; return propertyDescriptor; }
Таким образом, нам не нужен инъекционный сервис для запуска или остановки спиннера. Два простых метода декоратора просто называют .Next () на нашем поведении. Переменная загрузки $ экспортируется как наблюдаемая.
Давайте использовать его в нашем компоненте погрузочно-индикатора.
get isLoading$(): Observable{ return isLoading$; }
Сейчас внутри вашего шаблона вы можете использовать выгрузку $ Petter с Async-трубой, чтобы показать/скрыть все наложение.
Как вы можете видеть, я извлек спиннер в свой компонент, и я сделал несколько других вещей. Я добавил некоторую логику для ловушки фокуса и возможность настроить размер и цвет спиннера, используя напрыскиваемый.
import {LoadingIndicatorConfig} from './interfaces/loading-indicator.interfaces'; import {InjectionToken} from '@angular/core'; export const DEFAULT_CONFIG: LoadingIndicatorConfig = { size: 160, color: '#7B1FA2' }; export const LOADING_INDICATOR_CONFIG: InjectionToken= new InjectionToken('btp-li-conf');
Предоставление объектов конфигурации, используя институту, – это хороший способ обеспечить настраиваемые свойства в конструкторе.
constructor(@Inject(LOADING_INDICATOR_CONFIG) private config: LoadingIndicatorConfig) { }
Теперь мы должны объединить все в NGModule:
import {ModuleWithProviders, NgModule} from '@angular/core'; import {LoadingIndicatorComponent} from './loading-indicator/loading-indicator.component'; import {CommonModule} from '@angular/common'; import {SpinnerComponent} from './spinner/spinner.component'; import {DEFAULT_CONFIG, LOADING_INDICATOR_CONFIG} from './loading-indicator.config'; @NgModule({ declarations: [LoadingIndicatorComponent, SpinnerComponent], imports: [ CommonModule ], exports: [LoadingIndicatorComponent] }) export class LoadingIndicatorModule { static forRoot(): ModuleWithProviders { return { ngModule: LoadingIndicatorModule, providers: [{provide: LOADING_INDICATOR_CONFIG, useValue: DEFAULT_CONFIG}] }; } }
После создания библиотеки и установка ее в угловое приложение, запуск спиннера становится чрезвычайно легким, используя два метода декоратора.
Во-первых, нам нужно добавить компонент в правильное место в доме. Я обычно помещаю его в компонент ввода приложения, в нижнюю часть шаблона.
Loading indicator
Как видите, метод TriggerLoadingIndicator вызывается при нажатии кнопки. Этот метод является украшенным методом:
@startLoadingIndicator triggerLoadingIndicator() { setTimeout(this.triggerLoadingIndicatorStop.bind(this), 500); } @stopLoadingIndicator triggerLoadingIndicatorStop() { console.log('stopped'); }
И это так. Конечно, в реальном применении можно использовать его для украшения запросов и соответствующих обработчиков ответа. Быстрый совет: также украсьте ваши обработчики ошибок.:)
Большое спасибо за чтение этого поста в блоге. Если вы хотите попробовать вышеупомянутые Lib Out, вы можете найти пакет и инструкции для установки IT здесь Отказ
Вы также можете следовать за мной на Твиттер или же Гадость .