Расширение HTTP работает хорошо - в нашем проекте мы также хотели явный контроль «загрузчика» ака блесны для некоторых сценариев. Таким образом, у нас есть SpinnerService в нашем Core module, который доступен для всех компонентов.
@Injectable()
export class SpinnerService {
private spinnerStateSource = new Subject<SpinnerState>();
spinnerState$ = this.spinnerStateSource.asObservable();
private defaultMessage: string = 'Loading...';
show(message?: string) {
let msg = this.defaultMessage as string;
if (message) {
msg = message;
}
this.spinnerStateSource.next({ showing: true, message: msg });
}
hide() {
this.spinnerStateSource.next({ showing: false, message: '' });
}
spin(obs: Observable<any>, message?: string): Observable<any> {
this.show(message);
return obs.finally(() => this.hide());
}
}
class SpinnerState {
showing: boolean;
message: string;
}
компонент в основном модуле подписывается на услугу, чтобы показать/скрыть фактический спиннера UI (EDIT: так же, как в @ ответ Гюнтера в), а также другие компоненты могут (через службу) скажите вертушку, чтобы показать /скрывать.
Пример, который мы используем, если компонент должен выполнять несколько HTTP-вызовов, например. получить некоторые справочные данные, тогда мы хотим, чтобы счетчик показывал, пока все эти вызовы не будут выполнены. Поэтому мы вызываем функцию spin
с действием, которое мы ожидаем на
например. в потребляющем компоненте:
this.spinnerService.spin(
Observable.forkJoin(
this.refDataService.getRefDataList('statusTypes'),
this.refDataService.getRefDataList('itemTypes')
)
).subscribe(result => {
this.statusTypes = result[0];
this.itemTypes = result[1];
});
Здесь вы использовали 'SpinnerState'. Что это за значение по умолчанию? Я получил ошибку, когда копирую этот код. Также что такое 'spinnerState $'? – Jitendra
Это тип, содержащий информацию, чтобы перейти к spinner - я отредактировал мой пост –
Это хорошо работает, но мне нужно импортировать эту службу, когда я использую ее метод. Любой способ установить общий? Когда любой HTTP-запрос генерируется, он автоматически вызывает метод 'spinnerService.spin', поэтому мне не нужно вызывать этот метод в каждом запросе. – Jitendra