Вложенные FormGroups в FormArray не работают - PullRequest
0 голосов
/ 29 мая 2019

У меня есть простая реактивная форма с FormArray, которая будет содержать FromGroups.

Я знаю, что об этом спрашивали много раз, но я до сих пор не могу понять, почему он не работает.Я перепробовал много способов.Это два упрощенных примера, вместе с тем, что я прочитал из документации и нашел в Интернете.

Компонент:

@Component({
  selector: 'app-professional-info-form',
  templateUrl: './professional-info-form.component.html',
  styleUrls: ['./professional-info-form.component.scss']
})
export class ProfessionalInfoFormComponent implements OnInit {

  protected professionalInfo: FormGroup;

  constructor() { }

  ngOnInit() {
    this.initForm();
  }

  private initForm() {
    this.professionalInfo = new FormGroup({
      trainings: new FormArray([
        new FormGroup({
          institutionId: new FormControl(null, null),
          title: new FormControl(null, null),
          description: new FormControl(null, null),
          institution: new FormControl(null, Validators.required),
          grade: new FormControl(null, null),
          from: new FormControl(null, Validators.required),
          to: new FormControl(null, null)
        })
      ])
    });

  }

}   

HTML:

<form [formGroup]="professionalInfo" (ngSubmit)="onSubmit()" novalidate *ngIf="professionalInfo">
  <div formArrayName="trainings">
    <div *ngFor="let training of trainings.controls; index as t" [formGroupName]="t">
      <input type="text" [formControlName]="title" placeholder="Titolo" />
      <input type="text" [formControlName]="institution" placeholder="Istituto" />
      <input type="text" placeholder="Inizio" [formControlName]="from">
      <input type="text" placeholder="Fine" [formControlName]="to">
      <input type="text" placeholder="Voto" [formControlName]="grade" maxlength="5">
    </div>
  </div>
</form>

Консольошибка:

ERROR TypeError: Cannot read property 'controls' of undefined
    at Object.eval [as updateDirectives] (ProfessionalInfoFormComponent.html:19)

Если я добавлю этот метод к компоненту:

get trainingsFormArray() {
    return (<FormArray>this.professionalInfo.get('trainings'));
  }

И отредактирую * ngFor так:

<div *ngFor="let training of trainingsFormArray.controls; index as t" [formGroupName]="t">

Ошибка консоли:

ERROR Error: Cannot find control with path: 'trainings -> 0 -> '

Что сумасшедшего, потому что если console.log 'trainingsFormArray' после инициализации формы выдает следующее:

вывод console.log

Каждый раз, когда мне приходится работать с реактивными формами angular, я сталкиваюсь с такими проблемами, как эта.Я не могу найти последовательный способ заставить их работать с динамическими элементами управления, как в этом случае.Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы используете [formControlName]='title', для этого потребуется title, чтобы быть переменной с именем элемента управления.Вы можете избавиться от вмещающего [], и он будет работать нормально.Использовать как:

formControlName='title'
0 голосов
/ 29 мая 2019

В вашем шаблоне есть проблема. Angular не знает, что такое trainings. Вместо этого используйте professionalInfo.controls['trainings'].controls, чтобы получить доступ к элементам управления в trainings FormArray.

Примерно так:

<form 
  [formGroup]="professionalInfo" 
  (ngSubmit)="onSubmit()" 
  novalidate 
  *ngIf="professionalInfo">
  <div formArrayName="trainings">
    <div 
      *ngFor="let training of professionalInfo.controls['trainings'].controls; index as t" 
      [formGroupName]="t">
      <input type="text" formControlName="title" placeholder="Titolo" />
      <input type="text" formControlName="institution" placeholder="Istituto" />
      <input type="text" placeholder="Inizio" formControlName="from">
      <input type="text" placeholder="Fine" formControlName="to">
      <input type="text" placeholder="Voto" formControlName="grade" maxlength="5">
    </div>
  </div>
</form>

Вот Рабочий образец StackBlitz для вашей ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...