Angular 2+中markAsPristine等mark*方法是同步还是异步?
Angular表单控件状态方法的同步性与连续调用问题
核心问题解答
- 执行方式:
markAsPristine、markAsTouched、markAsDirty都是同步执行的,调用后会立刻修改控件的pristine、touched、dirty状态属性,没有异步延迟或队列等待。 - 连续调用可行性:完全可以对同一控件连续调用这些方法,每一次调用都会直接覆盖对应状态。比如你贴的代码里,控件状态会依次变为「已触摸→未修改→已修改」,最终状态是dirty(已修改)+ touched(已触摸)。
- 控件最终为pristine的可能性:按你给出的代码逻辑,最后一步是
markAsDirty(),正常情况下控件不会是pristine状态。但间歇性出现这个问题,大概率是其他代码在干扰:- 这段代码之后,有其他同步或异步逻辑(比如表单重置、状态重置)调用了
markAsPristine()或reset() - 表单被重新初始化,导致
someForm.get('someFormControl')获取到了新的控件实例,新实例默认是pristine状态 - 变更检测时机问题:如果在变更检测周期外修改状态,可能出现视图和实际状态暂时不一致,但这不是方法本身异步导致的
- 这段代码之后,有其他同步或异步逻辑(比如表单重置、状态重置)调用了
- 是否为异步发生:这些状态方法本身不会异步修改状态,出现pristine的情况要么是其他同步代码直接覆盖,要么是异步代码后续修改了状态,但状态变更的动作本身是同步的。
你提供的代码示例
this.someForm?.get('someFormControl')?.markAsTouched(); this.someForm?.get('someFormControl')?.markAsPristine(); this.someForm?.get('someFormControl')?.markAsDirty();
内容的提问来源于stack exchange,提问作者Banzo
相关产品推荐
相关产品推荐

