嵌套 ControlValueAccessor 的 Angular 验证状态未在父级中正确传播,如何实现此验证?

标签 angular formgroups controlvalueaccessor

我在 angular 10 应用程序中遇到了问题,在初始化时将 formGroup 的状态传播到其父级。
问题:在组件初始化时,子表单的验证状态没有在多于一层的父级中正确传播。
更准确地说,我有 3 个嵌套组件。它们都是表单,并且两个 child 都实现了 ControlValueAccessor。它们通过“formControlName”属性进行通信。最深的表单初始化错误(必填字段)。
父级没有收到有效性状态(它保持有效)。
这是问题的再现:
https://stackblitz.com/edit/ngx-sub-form-hzo8wj?file=src/app/app.component.ts
我希望“基本表单组”在初始化时无效。 “级别 2”的有效性应在“级别 1”中传播,然后在“基本表单组”中的“级别 1”中传播。
它可能来自正常的 Angular 循环。
我在等待更好的解决方案时发现了一个黑客:

  public ngAfterViewInit(): void {
    this._injector.get(NgControl).control.updateValueAndValidity();
  }
在第一个 Angular 循环之后,我们从子节点手动重新启动父节点的验证。这在所有子组件中级联。
我怎么能避免使用这个黑客?

最佳答案

您的父表单是有效的,因为它不知道嵌套控件,因为 AbstractSubformComponent 的每个实例将创建它自己的 formGroup。
修复它的一种方法是将子控件动态添加到父表单组。
Here is your stackblitz with changes

关于嵌套 ControlValueAccessor 的 Angular 验证状态未在父级中正确传播,如何实现此验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66332284/

相关文章:

angular - 位置 : sticky polyfill for angular 2

css - Angular2 2.4.3 和响应式网页设计 : using media queries seem not to work

javascript - Mat-select 不显示所选值

angular - 为什么我得到这些错误 "No value accessor for form control with path: ' rowDetails -> 0 -> no'”

Angular 8 - 表单验证无法正常工作

Angular 7 - ControlValueAccessor - 修剪绑定(bind)到表单的输入值

angular - 如何在 Angular Material 2 中下拉数量?

javascript - 对嵌套数组值执行数学运算并显示在表格中

css - Angular:如何暂时突出显示刚刚更改的dom元素?

Angular ControlValueAccessor 在(更改)事件中触发旧值