由于 Angular 6 中的加载程序拦截器,ExpressionChangedAfterItHasBeenCheckedError 错误

rea*_*ist 1 typescript angular angular6

我有一个 angular 6 项目。我创建了一个拦截器来显示“加载”面板。但是由于这个加载面板,我出现了这个错误。ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'ngIf: false'. Current value: 'ngIf: true'我该如何解决这个问题?

我的拦截器

export class LoaderInterceptor implements HttpInterceptor {
  constructor(private ch: CommonHelper) { }

    intercept(request: HttpRequest < any >, next: HttpHandler): Observable < HttpEvent < any >> {
      this.ch.showLoader();
      return next.handle(request)
        .pipe(
          tap((event: HttpEvent<any>) => {
            if (event instanceof HttpResponse) {
              this.ch.hideLoader();
            }
          }, (error: any) => {
            if (error instanceof HttpErrorResponse) {
              this.ch.messageHelper.showErrorMessage('Error Occured');
            }
            this.ch.hideLoader();
          })
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我的显示和隐藏方法

showLoader() {
    this.globals.displayLoader = true;
  }

hideLoader() {
    this.globals.displayLoader = false;
  }
Run Code Online (Sandbox Code Playgroud)

我的布局.html

 <div class="loading-screen" *ngIf="ch.globals.displayLoader">
    <div class="loading-loader"></div>
 </div>
Run Code Online (Sandbox Code Playgroud)

Par*_*ain 5

尝试将您的方法放在 setTimeout 中显示/隐藏,如下所示 -

setTimeout(() => {this.ch.hideLoader();}, 0)
Run Code Online (Sandbox Code Playgroud)

有关更多解释,请参阅此处 -

  • 我也有同样的问题。将加载器放入其自己的组件中帮助我解决了这个问题。即,不是在layout.html中嵌入加载div标签,而是创建一个加载器组件并将其放入layout.html中(例如,&lt;loader&gt;&lt;/loader&gt;。我相信这将负责在之间销毁和创建加载器导航可帮助您避免使用/设置超时。 (2认同)