Angular 反应式表单控制所有报告 ng-valid 和父表单报告为 ng-valid 但提交仍然禁用,直到单击表单控件

Angular Reactive form controls all report ng-valid and parent form reports as ng-valid but submit still disabled until clicking on a form control

希望我能在调试此应用程序时得到一些帮助。问题是提交按钮似乎与视图模型不同步。

例如,我有一个带有 select 控件的表单,该控件是必填字段。 select 选项是从 API 服务动态构建的,因此当表单加载时,select 已经预先设置了 select 选项并且应该是有效的。

但是,提交按钮被禁用了!启用提交按钮的唯一方法是简单地单击表单并手动设置 selected 选项(即使它与加载表单时设置的选项相同)。此交互导致提交启用。

在检查 HTML 表单加载时,表单有 ng-valid 样式并且没有 ng-invalid 出现。

什么会导致按钮与视图以及报告的控件和父窗体的 ng-valid 状态不同步?

更改为响应式表单。会更容易修复。

Template.html
    <form [formGroup]="formName">
        <mat-form-field>
            <mat-label>LABEL</mat-label>
            <input matInput formControlName="controlName"/>
        </mat-form-field>
    </form>
    
    ...
       <button mat-raised-button color="primary" (click)="onSubmit()"
           [disabled]="fChildComponent?.invalid || f.invalid">SUBMIT</button>
   

component.ts

@ViewChild(ChildComponent) child: ChildComponent;

get f(): FormGroup { return this.form; }
get fChildComponent(): FormGroup { return this.child.fchildForm }

那么你可以使child的状态无效。 或者您可以自定义 ControlValueAccessor, NG_VALUE_ACCESSOR and NG_VALIDATORS