Я пытаюсь реализовать глобальный индикатор загрузки, который можно повторно использовать во всем приложении.У меня есть инъекционный сервис, который имеет функции show и hide:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable()
export class SpinnerOverlayService {
private loaderSubject = new Subject<any>();
public loaderState = this.loaderSubject.asObservable();
constructor() { }
/**
* Show the spinner
*/
show(): void {
this.loaderSubject.next(<any>{ show: true });
}
/**
* Hide the spinner
*/
hide(): void {
this.loaderSubject.next(<any>{ show: false });
}
}
И это код компонента наложения счетчика.Я исключу подробности о реализации HTML и CSS, поскольку они здесь не важны.
import { Component, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { SpinnerOverlayService } from '../spinner-overlay.service';
@Component({
selector: 'spinner-overlay',
templateUrl: './spinner-overlay.component.html',
styleUrls: ['./spinner-overlay.component.scss']
})
export class SpinnerOverlayComponent implements OnInit {
show = false;
private _subscription: Subscription;
constructor(private spinnerOverlayService: SpinnerOverlayService) { }
ngOnInit(): void {
this._subscription = this.spinnerOverlayService.loaderState.subscribe((state) => {
console.log("Subscription triggered.");
this.show = state.show;
});
}
ngOnDestroy(): void {
this._subscription.unsubscribe();
}
}
Проблема: в коде компонента наложения я подписываюсь на наблюдаемое состояние loaderState службы.Однако, когда я вызываю функцию show (), которая вызывает next () наблюдаемого, обратный вызов подписки не запускается.
Вот как я вызываю функцию show () в app.component.ts:
ngOnInit() {
this.spinnerOverlayService.show();
}
Чего мне не хватать?Кажется действительно странным, что обратный вызов не запускается.
Вот пример в Stackblitz: https://stackblitz.com/edit/angular-7-registration-login-example-2qus3f?file=app%2Fspinner-overlay%2Fspinner-overlay.component.ts