何时以及在哪里调用updateValueAndValidity?

4
我不确定应该在何时何地调用 updateValueAndValidity
假设我有一个包含多个表单控件的表单组。 现在,基于某些单选选项的选择,会触发一个事件来修改多个表单控件的“验证器”。
问题1:我应该在修改后立即调用 updateValueAndValidity 还是在所有修改调用完成后再调用?
问题2:我应该通过表单更新表单组/表单控件以更新所有表单控件吗?
this.form.updateValueAndValidity('emitEvent': false);

或者单独调用每个表单控件。
this.form.get('control1').updateValueAndValidity('emitEvent': false);
this.form.get('control3').updateValueAndValidity('emitEvent': false);
this.form.get('control8').updateValueAndValidity('emitEvent': false);

因为我还在处理验证:https://angular.io/api/forms/AbstractControl#seterrors - undefined
https://angular.cn/api/forms/Validator && https://angular.cn/api/forms/FormControl - undefined
1个回答

5

为了安全起见,您需要对所有控件调用更新操作。

在这个答案https://dev59.com/UVgQ5IYBdhLWcg3w0HEA#54045398中,您可以看到这个函数(updateValueAndValidity)更新了父级控件。

目前它似乎执行以下操作(此列表基于方法名称):

  1. '设置初始状态'——将.status设为'VALID',除非所有控件都被禁用,否则将其设为'DISABLED'
  2. '更新值'——如果控件启用,则似乎会设置.value,如果禁用则清除它。
  3. '运行验证器'——这会更新整个错误对象。因此,如果您设置了自定义错误,则会清除它们。
  4. '取消订阅'——停止任何正在运行的异步验证器
  5. '发出'事件——(如果选项中emitEvent != false)。这只是值和状态正常形式的事件。
  6. 使用相同的规则更新父级——除非设置了onlySelf。

注意: 它不会向下遍历树,只会向上遍历。

请注意这行文字:它不会向树下遍历,只会向上遍历,因此如果您在 form 上调用该函数,则 controls 可能无法达到预期的行为,但更新控件将反映在表单上。
因此,尽管可能很麻烦,您需要更新每个控件的值和有效性。

问题:如果我将其应用于其中一个表单控件并上移,它不会对其他控件产生任何影响,只会直接影响父表单上的内容。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接