【问题标题】:Angular FormArray: Cannot find control with pathAngular FormArray:找不到带有路径的控件
【发布时间】:2018-12-24 04:20:04
【问题描述】:

我尝试构建一个 Angular Reactive 表单,其中一个帐户可以添加许多学生。

表格似乎有效。当你点击添加学生时,它会创建一个新学生,但你检查控制台它说

错误错误:找不到带有路径的控件:'studentsArray -> 1 -> 名字

对数组中的每个控件以此类推。

app.component.html

<form [formGroup]="accountForm">
<div>
    <input formControlName="firstName" placeholder="First name">
</div>
<div>
    <input formControlName="lastName" placeholder="Last name">
</div>
<div>
    <input formControlName="phone" placeholder="Phone">
</div>
<div>
    <input formControlName="email" placeholder="Email">
</div>
<button (click)="addStudent()" *ngIf="!showStudentForm">Add Student</button>
<div formArrayName="studentsArray">
    <div *ngFor="let student of studentsArray.controls; let i = index" [formGroupName]="i">
        <input formControlName="firstName" placeholder="First Name">
        <input formControlName="lastName" placeholder="Last Name">
        <input formControlName="dob" placeholder="Date of Birth">
    </div>
</div>

app.component.ts

import { Component, Input, OnChanges } from '@angular/core';
import { FormGroup, FormControl, Validators, FormArray, FormBuilder } from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
 @Input() account: Account;
  accountForm: FormGroup;

  constructor(private fb: FormBuilder) {
    this.createForm();
  }

   createForm() {
    this.accountForm = this.fb.group({
      'firstName': '',
      'lastName': '',
      'email': '',
      'phone': '',
      'studentsArray': this.fb.array([])
    });
   }

   ngOnChanges() {
    this.rebuildForm();
  }

  rebuildForm() {
    this.accountForm.reset({
      firstName: this.account.firstName,
      lastName: this.account.lastName,
      email: this.account.email,
      phone: this.account.phone
    });
    this.setStudents(this.account.students);
  }

  get studentsArray(): FormArray {
    return this.accountForm.get('studentsArray') as FormArray;
  }

  setStudents(students: Student[]) {
    const studentFGs = students.map(student => this.fb.group(student));
    const studentFormArray = this.fb.array(studentFGs);
    this.accountForm.setControl('studentsArray', studentFormArray);
  }

  addStudent() {
    this.studentsArray.push(this.fb.group(new Student()));
  }
}

export class Account {
  public firstName: '';
  public lastName: '';
  public email: '';
  public phone: '';
  public students: Student[];
}

export class Student {
  firstName: '';
  lastName: '';
  dob: '';
}

https://stackblitz.com/edit/angular-rqvv3a

任何建议将不胜感激。

【问题讨论】:

    标签: angular angular-reactive-forms formarray formgroups


    【解决方案1】:

    方法一: Code example 在您的组件中:

      addStudent() {
        this.studentsArray.push(this.fb.group({
          firstName:new FormControl (""),
          lastName: new FormControl (""),
          dob: new FormControl ("")
        }))
      }
    

    方法二: Code example 在您的组件中:

    import { Student } from './student.model'
    
     addStudent() {
        this.studentsArray.push(this.fb.group(new Student()));
      }
    

    创建学生模型: 文件名:student.model.ts

    文件内容:

    export class Student{
      constructor(
        public firstName:string,
        public lastName:string,
        public dob:string
      ){}
    }
    

    对于方法 1 或 2:

    在您的 HTML 中:

    <div formArrayName="studentsArray" ">
        <div *ngFor="let student of studentsArray.controls; let i = index" formGroupName="{{i}}">
            <input formControlName="firstName" placeholder="First Name">
            <input formControlName="lastName" placeholder="Last Name">
            <input formControlName="dob" placeholder="Date of Birth">
        </div>
    </div>
    

    您可以像这样显示表单的值以便于测试:

    {{accountForm.value | json}}
    

    【讨论】:

    • 感谢@Farasi78 的快速回复。这样可行!我希望将模型传递给它,而不是输入所有控件。有没有办法做到这一点?
    • 如果您想这样做,请将 Student 创建为模型并将其导入 - 我使用内联定义进行了尝试,但它似乎不起作用。 stackblitz.com/edit/angular-llkzlk。检查一下。
    • @Ty 你成功了吗?如果是这样,并且这个答案是正确的,请酌情指出。谢谢
    • 不客气!第二种方法允许您使用模型来执行此操作,而不必单独指定每个控件。
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2020-08-18
    • 2020-01-05
    • 2020-10-02
    • 2017-02-02
    相关资源
    最近更新 更多