- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我的项目集成一个加载指示器,其可见性将在 HTTP 拦截器服务中集中确定。但是,实现后,我收到以下错误:
ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'null'. Current value: 'true'.
以下是我的精简文件:
app.component.ts
import { SpinnerService } from '@app/services/spinner.service';
import { Subject } from 'rxjs';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnDestroy {
title = 'My App';
isLoading: Subject<boolean> = this.spinnerService.isLoading;
constructor(public spinnerService: SpinnerService) {
}
}
app.component.html
<div class="example-container" [class.example-is-mobile]="mobileQuery.matches">
<router-outlet></router-outlet>
<div *ngIf="isLoading | async" class="overlay">
Loading
</div>
</div>
spinner.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable()
export class SpinnerService {
isLoading = new Subject<boolean>();
constructor() {
}
show() {
this.isLoading.next(true);
}
hide() {
this.isLoading.next(false);
}
}
拦截器.service.ts
import { Injectable } from '@angular/core';
import {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse} from '@angular/common/http';
import {EMPTY, Observable, throwError} from 'rxjs';
import { environment } from '@env/environment';
import { finalize } from 'rxjs/operators';
import { SpinnerService } from '@app/services/spinner.service';
@Injectable()
export class JwtInterceptor implements HttpInterceptor {
// snackBar: MatSnackBar;
constructor(public spinnerService: SpinnerService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.spinnerService.show();
return next.handle(request).pipe(
finalize(() => this.spinnerService.hide()),
);
}
}
最后,我的其他组件中的示例用法如下:
this.http.get(`${environment.apiUrl}/form/schema/days`)
.subscribe(data => {
console.log('done', data);
});
我不知道我在这里做错了什么,有人可以解释一下吗?
最佳答案
理想情况下,您应该调用 NgOnInit Hook 内的数据源,这可以防止出现此问题。解决此问题的一种方法是使用 RXJS 延迟运算符使加载程序值更改在当前组件初始化周期之外发生:
isLoadingSubject = = new Subject<boolean>();
isLoading: Observable<boolean> = this.isLoadingSubject.pipe( delay(0) );
我认为这是一个相关的阅读:https://blog.angular-university.io/angular-debugging/
更新以在代码的第二行上解压一下:
Angular 功能变化检测 - 这是一个由以下因素触发的过程:
然后它会遍历应用程序的组件树,检查所有数据绑定(bind)(取决于 CD 策略等)。
当在同一更改检测周期内,Angular 检测到绑定(bind)值在对该绑定(bind)执行更改检查后已经发生更改时,就会发生您看到的错误,从而导致 Angular 出现问题,因为它无法更新绑定(bind)值相应的模板。
因此,为了解决这样的问题,我们可以确保更改在特定 CD 周期开始之前发生(有时我们可以通过将数据更改操作移动到不同的组件生命周期 Hook 来实现)或延迟它 - 确保更改将在在下一个周期执行。
RXJS 的延迟使用了 setTimeout(),如上所述,它确实触发了它自己的另一个 CD 周期。主题是一个可观察的对象,可以多播到多个观察者。因此,我们通过管道将其设置为“延迟”,从而为该特定更改保留 CD 周期。
所以,如果我们迂腐的话——这更像是一种有效的解决方法。但代价是我们在这里运行的另一个 CD 周期。
关于angular - ExpressionChangedAfterItHasBeenCheckedError Angular ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63229070/
绕圈子讨论如何解决这个问题。阅读到处突出显示的两个博客。了解原因,但无论我尝试什么,这个错误都不会消失。错误与输入参数有关。当组件加载时,它是未定义的,然后获得正确的值。 我试过使用: 子组件中的各种
我正在用数组中的数据填充表格,我想将自定义输入集中在表格的最后一个元素上,所以我有这个: {{ a few table fields}}
我在我的 Angular 应用程序中做了一个加载微调组件。我用 *ngIf="isLoading"将它放在路由器导出旁边的应用程序组件中,这样我就可以让它在应用程序的任何地方都可见。 'isLoadi
我正在为我的项目集成一个加载指示器,其可见性将在 HTTP 拦截器服务中集中确定。但是,实现后,我收到以下错误: ExpressionChangedAfterItHasBeenCheckedErro
我正在实现以下*ngIf。我知道从技术上讲我不应该从 *ngIf 中调用函数,但黑客需要它: 无论如何,以下实现工作正常: 但是,由于某种原因,这个 *ngIf 被多次调用。所以我在第一个代码示例
我在主要组件的 [height] 上遇到以下错误并正在寻找解决方案 Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has
我的 Angular 应用程序的结构是页眉、主体和页脚,周围是一个 div。根据标题的高度(它是响应式的),我必须在周围的 div 上设置 padding-top。 为此,我向从 app.compon
我正在尝试解决 AngularJS 中不存在的问题,因为 $digest-循环会检查所有内容。 我正在尝试创建一个组件,它可以自行初始化(异步)并通知其周围的容器加载已完成。 我有这个伪表:
我创建了这个 Angular 7 应用程序,我试图按如下方式获取图像源: generateProfilePictures() { const p
我有一个父组件,它每秒更新一次它的数组 myValue。在子组件中,我想创建一个图表,它使用这个数组作为数据,并在每次父组件更新时更新。 当我运行此应用程序时出现此错误: Error: Express
我在使用 Angular 4 时遇到了一点问题。抛出以下错误 Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has ch
我需要在运行时动态创建多个组件的实例。 我在互联网上找到了几个示例,包括 StackOverflow 和 angular.io 页面本身。 但是当我为组件模型赋值时总是收到异常 ExpressionC
我有一个简单的 Angular 5 应用程序,它带有一个 HttpInterceptor,它会在发出请求时通知服务。组件可以订阅此服务以获取此信息。 此处有错误的完整示例=> https://stac
我正在尝试访问 ngOnit 中的 rest api,如下所示:- ngOnInit(): void { this.myModel = new myModel (); Observ
在父组件中 => ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. P
请向我解释为什么我不断收到此错误:ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was ch
我在选择器上使用 NGRX 过滤器,以根据过滤器的状态值过滤列表中的项目。首次加载页面时,没有问题。如果我刷新页面,我会收到 ExpressionChangedAfterItHasBeenChecke
我有一个简单的 Angular 组件,在渲染时抛出以下错误: MyComponent.html:10 ERROR Error: ExpressionChangedAfterItHasBeenCheck
怎么了? 在控制台中收到以下错误: AboutComponent.html:1 ERROR 错误:ExpressionChangedAfterItHasBeenCheckedError:检查后表达式已
正如标题所示,我试图在页面加载后向 div 元素添加一个类!我有一个条件 isTrue,并且在页面加载后执行的 Angular 函数 ngAfterViewInit() 使 isTrue 值为 tru
我是一名优秀的程序员,十分优秀!