Ich versuche, ein loading Spinner auf jeder http.get
Aktion in meiner App hinzuzufügen.ExpressionChangedAfterItHasBeenCheckedError beim Laden von Service
Hier ist meine http.get:
protected get(url: string): any {
//Loading start
this.sessionService.showLoader();
(...)
}
Die SessionService
meinen Anruf LoadingService
:
constructor(private cookieService: CookieService, private loadingService : LoadingService) {
}
public showLoader(): void {
this.loadingService.show();
}
public hideLoader(): void {
this.loadingService.hide();
}
hier ist mein Service LoadingService
import { Injectable, OnInit, EventEmitter } from '@angular/core';
@Injectable()
export class LoadingService implements OnInit {
public loadingEvent: EventEmitter<boolean>;
constructor() {
this.loadingEvent = new EventEmitter();
}
ngOnInit() {
this.loadingEvent.emit(false);
}
show() {
this.loadingEvent.emit(true);
}
hide() {
this.loadingEvent.emit(false);
}
}
Dann ist hier ein Teil Meine Hauptlayoutkomponente:
showLoadingDiv : boolean;
constructor(public loadingService : LoadingService) {
}
ngOnInit() {
}
ngAfterViewInit(){
this.loadingService.loadingEvent.subscribe((res) => {
this.showLoadingDiv = res;
});
}
Und schließlich in meiner HTML-Layout-Vorlage:
<div class="loaddiv" *ngIf="showLoadingDiv">
Loading...
</div>
Wenn andere Module Last schnell, ich habe nicht den Fehler ExpressionChangedAfterItHasBeenCheckedError
aber Wenn ein Modul eine wenig Zeit in Anspruch nehmen (weil große Daten), Ich habe diesen Fehler.
Ich sehe das schon so, aber nicht für mich arbeiten: https://stackoverflow.com/a/38846793/1729211
Ich mag die Timeout-Lösung nicht, weil es von der Antwort anderer Server abhängt. Die einzige Lösung, die ich gefunden habe, ist '[class.hidden] ="! ShowLoadingDiv "'. Wenn ich '[ngClass] =" showLoadingDiv? 'Show': 'hidden' "' verwende, bekomme ich den Fehler. Gleiches mit '* ngIf =" showLoadingDiv "' – Portekoi
Eine andere Lösung könnte sein, die ChangeDetection selbst im Subscribe aufzurufen, indem Sie 'ChangeDetectorRef' in Ihren Konstruktor injizieren und' detectChanges' in Ihrem Subscribe aufrufen – Chris