私は、アプリケーションの各http.get
アクションにローディングスピナーを追加しようとしています。ここでLoadingChangedAfterItHasBeenCheckedErrorサービスの読み込み
は私http.getです:
protected get(url: string): any {
//Loading start
this.sessionService.showLoader();
(...)
}
SessionService
は私LoadingService
を呼び出します。ここ
constructor(private cookieService: CookieService, private loadingService : LoadingService) {
}
public showLoader(): void {
this.loadingService.show();
}
public hideLoader(): void {
this.loadingService.hide();
}
は私のサービスは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);
}
}
あるし、ここの一部であります私の主なレイアウトコンポーネント:
showLoadingDiv : boolean;
constructor(public loadingService : LoadingService) {
}
ngOnInit() {
}
ngAfterViewInit(){
this.loadingService.loadingEvent.subscribe((res) => {
this.showLoadingDiv = res;
});
}
そして最後に、私のHTMLレイアウトテンプレートで:
<div class="loaddiv" *ngIf="showLoadingDiv">
Loading...
</div>
、他のモジュールがロード速い場合、私はエラーExpressionChangedAfterItHasBeenCheckedError
を持っていないが、モジュールは(膨大なデータので)少し時間がかかる場合は、私はこのエラーがあります。私はすでに、これはSOではなく、私のために働く見てる
:ngAfterViewInitライフサイクルフックで値を変更する場合 https://stackoverflow.com/a/38846793/1729211
タイムアウト解決策が他のサーバーの応答に依存するので、私はそれを好まないのです。私が見つけた唯一の解決策は '[class.hidden] ="!showLoadingDiv "'を使うことです。 '[ngClass] =" showLoadingDiv? 'show': 'hidden' "'を使用すると、エラーが発生します。 '* ngIf =" showLoadingDiv "と同じです。 – Portekoi
もう1つの解決策は、ChangeDetectionを自分のコンストラクタに注入し、あなたのサブスクライブ内で' detectChanges'を呼び出すことによって、サブスクライブで自分自身でChangeDetectionを呼び出すことです – Chris