动态创建 formArray

Dynamically formArray creating

我有一个表单组名称 studentRegistrationForm。我想以这种形式创建 动态 studentList 数组,但我不能这样做。

ngOnInit(){
 this.studentRegistrationForm = this.formBuilder.group({
      session: ['', [Validators.required]],
      semester: ['', [Validators.required]],
      students: ['',[Validators.required]],
      studentList: this.formBuilder.array([
      ]),
    });

    let control = <FormArray>this.studentRegistrationForm.controls['studentList'];


    this.studentRegistrationForm.valueChanges
      .subscribe( data => {
        if(data.semester  && data.session && data.students){
          control.push(this.createStudent());
        }

      });
}

  createStudent() {
    return new FormGroup({
      id: new FormControl('', Validators.required),
      email: new FormControl('',Validators.required)
    })
  }

如评论中所述,您的问题是您正在订阅表单更改,然后向表单添加更多数据,触发表单更改,依此类推,直到达到堆栈限制。

如果没有关于您的用例的更多上下文,我的建议是删除对表单更改的订阅,而是添加一个用于将新学生添加到列表的按钮,除非当前表单有效,否则您可以禁用该按钮(类似于您已有的逻辑):

<div formArrayName="studentList" class="well well-lg">
    <div *ngFor="let student of students.controls; let i=index" [formGroupName]="i">
        <label for="id">ID:</label><input formControlName="id">
        <label for="id">EMail:</label><input formControlName="email">
    </div>
    <button type="button" (click)="doCreateStudent()" [disabled]="!studentRegistrationForm.valid">Add Student</button>
</div>

由于您已经为学期、课程和学生字段定义了验证器,因此您可以在允许添加新学生之前使用 studentRegistrationForm.valid 测试有效性。

这是一个最小的 stackblitz,演示了您的代码可以正常工作: