Лучший способ сделать это - создать наблюдаемое для управления состоянием загрузки. Я предпочитаю использовать BehaviorSubject
, потому что он запоминает последнее значение, которое он испустил. Вы можете иметь несколько компонентов подписаться на сервис загрузки. (больше на предметах поведения здесь ).
Вот ссылка на стек, где я реализовал простую версию этой службы загрузчика: https://stackblitz.com/edit/angular-loading-service-subscribe
РЕДАКТИРОВАТЬ: я добавил код для child.component
в ответ. У меня это было в стеке, но я забыл добавить его сюда.
Ключевые примечания:
loading.service.ts
имеет BehaviorSubject
, который определяет, загружает ли приложение данные или нет. Он возвращает себя .asObservable()
, поэтому никакие дочерние компоненты не могут вызывать .next()
для него.
export class LoadingService {
private _isLoading$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
get isLoading$(): Observable<boolean> {
return this._isLoading$.asObservable();
}
// see the rest of the code in the stackblitz
}
Как только это подключено, введите его в компонент.
app.component.ts
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
// by making it public, you can subscribe in the template
constructor(public loadingService: LoadingService) { }
}
app.component.html
<ng-template [ngIf]="loadingService.isLoading$ | async" [ngIfElse]="loaded">
Loading
</ng-template>
<ng-template #loaded>
Content has loaded
</ng-template>
<!-- see child.component -->
<child></child>
child.component может управлять индикатором загрузки с помощью loading.service
.
@Component({
selector: 'child',
template: `
<h1>Child Component</h1>
<button (click)="toggleLoading()">Change Loading</button>
`,
styles: [`h1 { font-family: Lato; }`]
})
export class ChildComponent {
constructor(public loadingService: LoadingService) { }
// simulates a 3 second load time for fetching data
ngOnInit() {
this.loadingService.startLoading();
setTimeout(() => {
this.loadingService.stopLoading();
}, 3000);
}
// simple method to simulate user action that loads some new data
toggleLoading(): void {
this.loadingService.toggleLoading();
}
}
проверьте этот ресурс для получения информации о ng-template
: https://toddmotto.com/angular-ngif-else-then
и этот для async
трубы: https://angular.io/api/common/AsyncPipe