添加值后无法验证 Angular 表单生成器表单组中的必填字段

Can't validate a required field in Angular form builder form group after adding a value

这是我的 stackblitz

当我单击我的按钮(在 Stackblitz link 中)并将一个值推送到数组时,我希望该字段有效,但它仍然无效。如果我在一个值中硬编码,它显示为有效,但如果我从点击事件中推送一个值则不是。

问题 - 谁能帮我理解为什么?我需要使用某种 formArray 类型吗?

这是我的代码。

registerForm: FormGroup;

constructor(private formBuilder: FormBuilder) {}

ngOnInit() {
  this.registerForm = this.formBuilder.group({
    practicedStyles: [[], [Validators.required]]
  });
}

get practicedStyles() {
  return this.registerForm.get('practicedStyles');
}

add() {
  this.practicedStyles.value.push(1);
}
<div class="card m-3">
  <h5 class="card-header">Angular 8 Reactive Form Validation</h5>
  <div class="card-body">
    <form [formGroup]="registerForm">
      <p>Is valid: {{practicedStyles.valid}}</p>
      <p>Is required: {{practicedStyles.errors?.required}}</p>
      <button class="btn btn-primary" (click)="add()">Add</button>
    </form>
  </div>
</div>

您尝试使用 FormGroup.setValue 了吗?

    add() {
      this.registerForm.get('practicedStyles').value.push(1);
      this.registerForm.setValue({practicedStyles: this.registerForm.get('practicedStyles').value});
    }

我认为将值直接推送到数组不会触发更改,因为您没有更改对象的引用。如果您尝试将 FormGroup 控件重新分配给新对象: this.practicedStyles.value = 1 您将收到以下错误消息 Cannot assign to 'value' because it is a read-only property.

在操作 FormGroup 控件时,您应该使用 FormGroup 提供的方法来执行此操作:

因此,即使您没有更改对象的引用,您也是在通知框架该对象确实发生了更改。