【问题标题】:Dynamically formArray creating动态形成数组创建
【发布时间】:2018-05-11 19:05:06
【问题描述】:

我有一个表单组名称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)
    })
  }

【问题讨论】:

  • 这很可能是因为您正在修改表单(studentList 表单控件在表单中)每次表单中的值发生更改...这会触发另一个表单更改...等等.
  • 实际上我给出了一个条件,它在某个值处执行..所以它每次都在里面调用
  • 如果您有建议请回答我如何通过示例实现这一目标

标签: ionic3 angular5 angular4-forms


【解决方案1】:

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

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

<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 来测试有效性。

这是一个最小的堆栈闪电战,展示了您的代码在没有错误的情况下工作:

【讨论】:

  • 实际上我需要动态创建学生。取决于学生人数。如果输入为 4,则创建 4 个数组元素。
  • 好的,下次将此要求添加到您的问题中。更新了 Stackblitz 以显示如何使用按钮执行此操作 - 如果您愿意,您可以在学生字段上订阅 valueChanges,但这可能会让 IMO 感到沮丧
猜你喜欢
  • 2015-07-30
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多