【发布时间】:2021-07-27 21:10:43
【问题描述】:
我有以下问题:
我在我的一个角度组件中定义了一个 Angular FormGroup,其中有几个 FormControl-s,使用 Angular Material 显示。每改变一个特定的输入值,我就重置这个表单,创建一个新的 FormGroup 实例,并将它分配给同一个变量,方式如下:
this.sampleForm = this.formBuilder.group({
'samplePropertyName': new FormControl(
{ value: this.dataVo.samplePropertyName, disabled: !this.isEditable() },
[...]
},
{ updateOn: 'blur' }
);
这部分工作得很好。可见字段都会更新为正确的新值。但是,禁用状态并非如此。每个不是基本输入字段而是来自 Angular Material 的唯一字段类型(例如 mat-select 或 mat-datepicker)的字段都无法正确更新其禁用状态。
我尝试启用和禁用 formGroup 本身,但没有成功。调用 changeDetectorRef 也不起作用。唯一的解决方案是不分配新的表单实例,而是一个一个地更新现有的表单控件?我真的希望不是这样,因为这个表单有很多字段。
【问题讨论】:
-
您是否尝试过在每个 formControl 上手动调用
disable()和enable()方法,而不是在 FormControl 构造函数中设置它?这样组件应该捕获事件...如果它不起作用,请尝试在setTimeout(() => xxx, 0)中调用它们以使其异步? -
我自己尝试过禁用和启用,但没有用。但是,它与 setTimeout 一起使用。但是,由于字段众多,这不是一个理想的解决方案,也因为我很困惑为什么它会以这种方式工作,而不是通过预期的方式。
-
你能不能考虑一下,把所有要禁用的字段做成一个formgroup,然后作为formArray传递,一次性禁用整个formGroup。比如:
this.mainFormGroup.get('newFormArrayControl').disable();