Рубрики
Без рубрики

Повторное использование. Слово, которое пересекло мой разум несколько раз недавно, работая над угловым проектом. Я решил создать свои собственные угловые руологические материалы и блог о опыте. Фото Лука Браво на Unspplashso, что именно является погрузочным индикатором? Обычно это спиннер какой-то своего рода

Повторное использование. Слово, которое пересекло мой разум несколько раз недавно, работая над угловым проектом. Я решил создать свои собственные угловые руологические материалы и блог о опыте. Фото Лука Браво на Unspplashso, что именно является погрузочным индикатором? Обычно это спиннер какой-то своего рода

Автор оригинала: 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 здесь Отказ

Вы также можете следовать за мной на Твиттер или же Гадость .