在加载组件中检查后表达式发生了变化
expression has changed after it was checked in loading component
我在 angular 中遇到了重复的问题,但我搜索了很多关于这个问题的信息,并使用了在 Whosebug 中回答的所有技术和...。
当我订阅了一个以上时,我的问题出在我的加载程序组件中。
这是我的加载器组件
import { Component, ChangeDetectionStrategy, ChangeDetectorRef, DoCheck, OnChanges, AfterViewInit, OnInit } from '@angular/core';
import { Subject, BehaviorSubject } from 'rxjs';
import { LoaderService } from './loader.service';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'app-loader',
templateUrl: './loader.component.html',
styleUrls: ['./loader.component.scss']
})
export class LoaderComponent implements OnInit {
isLoading: BehaviorSubject<boolean>=this.loaderService.isLoading;
constructor(private loaderService: LoaderService, private changeDetector: ChangeDetectorRef) {
}
color = 'accent';
mode = 'indeterminate';
value = 50;
ngOnInit(): void {
}
}
这是我的服务加载器组件
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class LoaderService {
constructor() { }
isLoading: BehaviorSubject<boolean> = new BehaviorSubject(false);
count=0;
show(): void {
debugger
console.log(`show`+this.count++)
this.isLoading.next(true);
}
hide(): void {
debugger
console.log(`hide`+this.count++)
this.isLoading.next(false);
}
}
这是我的拦截器加载器
import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { LoaderService } from './loader/loader.service';
@Injectable()
export class LoaderInterceptor implements HttpInterceptor {
constructor(public loaderService: LoaderService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loaderService.show();
return next.handle(req).pipe(
finalize(() => {this.loaderService.hide(); })
);
}
}
我的错误信息是
“
ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'ngIf: [object Object]'. Current value: 'ngIf: true'.
at viewDebugError (core.js:17871)
at expressionChangedAfterItHasBeenCheckedError (core.js:17859)
at checkBindingNoChanges (core.js:18059)
at checkNoChangesNodeInline (core.js:27635)
at checkNoChangesNode (core.js:27624)
at debugCheckNoChangesNode (core.js:28228)
at debugCheckDirectivesFn (core.js:28156)
at Object.updateDirectives (loader.component.html:2)
at Object.debugUpdateDirectives [as updateDirectives] (core.js:28145)
at checkNoChangesView ("
请帮我解决 it.it 的大问题:-(
我不太确定 'ngIf' 语句在哪里使用,但替代方法可能是使用 css 在不使用时隐藏加载程序。例如
<div #myLoader [style.display]="isLoading ? 'block' : 'none'>...
为避免它为您的 isLoading 设置默认值 属性(例如 false),并等待 ngOnInit 或 ngAfterViewInit 更改组件中的 属性。
试图在一个独立的 stackblitz 实例 https://stackblitz.com/edit/angular-multisub 中复制您的代码,并为 loaderService
提供多个订阅。
工作没有任何问题。
您能否分叉上述实例并修改以重现相同的实例。
我正在将 "behavior subject" 更改为可观察的。在加载页面中订阅数据并在生活中使用 angular 变化检测器 cycle.Now,问题已解决并正常工作
我在 angular 中遇到了重复的问题,但我搜索了很多关于这个问题的信息,并使用了在 Whosebug 中回答的所有技术和...。
当我订阅了一个以上时,我的问题出在我的加载程序组件中。
这是我的加载器组件
import { Component, ChangeDetectionStrategy, ChangeDetectorRef, DoCheck, OnChanges, AfterViewInit, OnInit } from '@angular/core';
import { Subject, BehaviorSubject } from 'rxjs';
import { LoaderService } from './loader.service';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'app-loader',
templateUrl: './loader.component.html',
styleUrls: ['./loader.component.scss']
})
export class LoaderComponent implements OnInit {
isLoading: BehaviorSubject<boolean>=this.loaderService.isLoading;
constructor(private loaderService: LoaderService, private changeDetector: ChangeDetectorRef) {
}
color = 'accent';
mode = 'indeterminate';
value = 50;
ngOnInit(): void {
}
}
这是我的服务加载器组件
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class LoaderService {
constructor() { }
isLoading: BehaviorSubject<boolean> = new BehaviorSubject(false);
count=0;
show(): void {
debugger
console.log(`show`+this.count++)
this.isLoading.next(true);
}
hide(): void {
debugger
console.log(`hide`+this.count++)
this.isLoading.next(false);
}
}
这是我的拦截器加载器
import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { LoaderService } from './loader/loader.service';
@Injectable()
export class LoaderInterceptor implements HttpInterceptor {
constructor(public loaderService: LoaderService) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loaderService.show();
return next.handle(req).pipe(
finalize(() => {this.loaderService.hide(); })
);
}
}
我的错误信息是 “
ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'ngIf: [object Object]'. Current value: 'ngIf: true'.
at viewDebugError (core.js:17871)
at expressionChangedAfterItHasBeenCheckedError (core.js:17859)
at checkBindingNoChanges (core.js:18059)
at checkNoChangesNodeInline (core.js:27635)
at checkNoChangesNode (core.js:27624)
at debugCheckNoChangesNode (core.js:28228)
at debugCheckDirectivesFn (core.js:28156)
at Object.updateDirectives (loader.component.html:2)
at Object.debugUpdateDirectives [as updateDirectives] (core.js:28145)
at checkNoChangesView ("
请帮我解决 it.it 的大问题:-(
我不太确定 'ngIf' 语句在哪里使用,但替代方法可能是使用 css 在不使用时隐藏加载程序。例如
<div #myLoader [style.display]="isLoading ? 'block' : 'none'>...
为避免它为您的 isLoading 设置默认值 属性(例如 false),并等待 ngOnInit 或 ngAfterViewInit 更改组件中的 属性。
试图在一个独立的 stackblitz 实例 https://stackblitz.com/edit/angular-multisub 中复制您的代码,并为 loaderService
提供多个订阅。
工作没有任何问题。
您能否分叉上述实例并修改以重现相同的实例。
我正在将 "behavior subject" 更改为可观察的。在加载页面中订阅数据并在生活中使用 angular 变化检测器 cycle.Now,问题已解决并正常工作