【问题标题】:FormArray in Angular Reactive Form not resetting on form submitAngular Reactive Form中的FormArray未在表单提交时重置
【发布时间】:2020-12-19 17:26:29
【问题描述】:

我正在尝试使用反应式表单在表单中创建一个多选复选框列表,但遇到了一个问题,即我创建的用于存储所选复选框值的 FormArray 在提交时没有与表单的其余部分一起重置.这会导致一个包含多个空值的数组,对应于之前的提交。

相关html代码:


<form [formGroup]="dieSetForm" (ngSubmit)="submitForm()" novalidate>
<label>Die Types:
        <div *ngFor="let dieType of dieTypes; let i = index">
            <label for="dieType{{dieType}}">
                <input 
                id="dieType{{dieType}}" 
                type="checkbox" name="dieType" 
                [value] = "dieType.value" 
                (change)="onCheckboxChange($event)">
                {{dieType.name}}
                </label>
        </div>
        </label>
        <input type="submit" value="Submit">
    </form>



and the relevant part of the component.ts file:



    export class CreateDieSetComponent implements OnInit {
  
  dieSetForm: FormGroup;

  constructor(private fb: FormBuilder) {
    this.dieSetForm = this.fb.group({
      dieTypesCheck: this.fb.array([]),
      name: new FormControl('')
    })
  }


  dieTypes: Array<any> = [
    { name: '4', value: '4'},
    { name: '6', value: '6'},
    { name: '8', value: '8'},
    { name: '10', value: '10'},
    { name: '12', value: '12'},
    { name: '20', value: '20'}
  ];

  onCheckboxChange(e) {
    const dieTypesCheck: FormArray = this.dieSetForm.get('dieTypesCheck') as FormArray;

    if (e.target.checked) {
      dieTypesCheck.push(new FormControl(e.target.value));
    } else {
      let i: number = 0;
      dieTypesCheck.controls.forEach((item: FormControl) => {
        if (item.value == e.target.value) {
          dieTypesCheck.removeAt(i);
          return;
        }
        i++;
      });
    }
  }

  submitForm() {
    console.log(this.dieSetForm.value.name);
    console.log(this.dieSetForm.value.dieTypesCheck);
    this.dieSetForm.reset();
  }

  ngOnInit() {
  }
}

【问题讨论】:

  • 你没有输入来控制 FormArray :(

标签: javascript angular angular-reactive-forms angular-formbuilder


【解决方案1】:

表单数组需要手动清空,重置只是重置其中的控件,您必须添加以下内容:

(this.dieSetForm.get('dieTypesCheck') as FormArray).clear();

如果您还想删除所有控件,就在您对组调用重置之前。

【讨论】:

  • 非常感谢,成功了!这是我第一次使用表单数组,所以我学到了一些新东西。
  • np,不要忘记标记和支持帮助的人
猜你喜欢
  • 2019-01-31
  • 2021-12-30
  • 1970-01-01
  • 2023-03-07
  • 2020-07-28
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多