Angular UT报错Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError
有一个Angular的Component的单元测试代码,执行后fixture.detectChanges();
就会报错Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value for 'showLoading': 'true'. Current value: 'false'. Find more at https://angular.io/errors/NG0100。
代码是这样的,只是在ngAfterViewInit方法里修改了showLoading的值。
export class StartComponent implements AfterViewInit {
showLoading = true;
ngAfterViewInit(): void {
this.showLoading = false;
}
}
UT的代码是这样的:
describe('StartComponent', () => {
let component: StartComponent;
let fixture: ComponentFixture<StartComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [StartComponent]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(StartComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
ExpressionChangedAfterItHasBeenCheckedError 错误通常发生在 Angular 的变更检测周期中,它表明在变更检测期间,某些表达式的值已经被修改,这与预期不符合。
在的情况下,fixture.detectChanges() 触发了变更检测,但在变更检测期间,某些属性(如 showLoading)的值发生了变化。由于 Angular 在变更检测期间检测到了这个不一致,因此抛出了 ExpressionChangedAfterItHasBeenCheckedError 错误。
解决这个问题的方法之一是使用 Angular 的生命周期钩子来进行处理。可以使用 ngAfterViewInit() 或 ngAfterContentInit() 钩子来在组件视图初始化完成后再执行的变更操作。这样可以确保在 Angular 完成视图的初始化之后再进行变更操作,避免了在变更检测周期内引起的不一致性。
另外,还可以使用 setTimeout() 来将变更操作推迟到下一个 JavaScript 事件循环中。这样可以使变更操作在 Angular 的变更检测周期之外进行,从而避免了错误的发生。
总之,避免在变更检测周期内修改属性值是解决这个错误的关键。使用 Angular 的生命周期钩子或将变更操作推迟到下一个 JavaScript 事件循环中是解决这个问题的两种常见方法。
更新于:5个月前相关文章
- Angular UT 模拟执行setTimeout
- Angular Mock 一个类的静态方法
- 国外流行的前端框架有哪些?
- PHP 导出 Excel 报错: Formula Error: An unexpected error occurred
- MySQL5.7 中使用 group by 报错 this is incompatible with sql_mode=only_full_group_by
- angular卡installing packages解决方法
- Angular scrollPositionRestoration回到顶部无效
- Angular echarts No provider for InjectionToken NGX_ECHARTS_CONFIG!错误
- Angular如何mock window对象
- linux中Qt工程编译报错: error: 找不到 -lGL
- PHP7.4命令行报错:VC运行库和PHP版本不兼容
- Angular自定义验证器ValidatorFn单元测试
- 打开vmware虚拟机报错—该虚拟机似乎正在使用中
- React Error: Exceeded timeout of 5000 ms for a test. 错误
- 前端请求PHP接口,报错跨域问题
- angular switchMap的用法
- Apache报错:无法使用可靠的服务器域名
- mysql报错xamp table 'pma__recent' is read only
- 浏览器报错 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- linux编译报错:/usr/include/c++/7/cstdlib:41:10: fatal error: bits/c++config.h: No such file or directory