angular 4 вложенных formArray Не удается найти элемент управления с путем: 'сегментRows3 -> 1 -> сегментId3' - PullRequest
0 голосов
/ 01 мая 2018

I не может отправить в массив. У меня есть сегмент (идентификатор, время), который может иметь одного или нескольких человек (роль, информация). Поле генерируется динамически. При загрузке на странице отображаются поля (см. Изображение ниже).
enter image description here

При попытке добавить сегмент я получаю сообщение об ошибке: ERROR TypeError: Cannot find control with path: 'segmentRows3 -> 1 -> segmentId3'
Вот код из файла .ts:

addSegment() {
let segmentRows3 = this.mySummaryForm.get('segmentRows3') as FormArray;
    segmentRows3.push(this.fb.array([
        this.fb.group({
            segmentTime3: '',
            segmentId3: '',             
            personRows3: this.fb.array([
            this.fb.group({
               personR3: '',
               personI3: ''
              })
            ])
        })
      ]));
  }   

  segmentRows3: this.fb.array([
    this.fb.group({
        segmentId3: '',
        segmentTime3: '',
        personRows3: this.fb.array([
        this.fb.group({
           personR3: '',
           personI3: ''
          })
        ])
    })
  ]),

.html код

<div formArrayName="segmentRows3">
  <label><h2>New segment</h2></label>
  <div *ngFor=" let segmentRow of mySummaryForm.controls.segmentRows3.controls; let i=index " > 
    <div  class="form-group" [formGroupName]="i" >   {{i+1}}
        <label for="segmentId3">Segment ID
            <select formControlName="segmentId3" placeholder="pick" type="text" id="segmentId3" class="form-control" [(ngModel)]="levelNumSegment3" (ngModelChange)="toNumberSegment3()">
                <option *ngFor="let level of segmentId" [value]="level.num">{{level.name}}</option>
            </select> 
        </label>      
        <label for="segmentTime3">Segment time
            <input formControlName="segmentTime3" type="text" id="segmentTime3" class="form-control" placeholder="select a time" (ngModelChange)="onChange($event)">
        </label>
        <button type="button" (click)="addPerson(i)" class="btn btn-info">Add a person</button><br><br> 
        <div formArrayName="personRows3">
            <div *ngFor=" let personRow of segmentRow.controls.personRows3.controls; let j=index " >
                <div  class="form-group" [formGroupName]="j" >   {{j+1}}    
                        <label for="personR3">person Role 
                        <input formControlName="personR3" [typeahead]="personRole" [typeaheadOptionsLimit]="10" [typeaheadMinLength]="0" type="text" id="personR3" class="form-control" placeholder="select a role" (ngModelChange)="onChange($event)" >
                        </label>
                        <label for="personI3">Person infos
                        <input formControlName="personI3" [typeahead]="states" [typeaheadOptionsLimit]="10" [typeaheadMinLength]="0" type="text" id="personI3" class="form-control" placeholder="select infos" (ngModelChange)="onChange($event)" >
                        </label>
                        <label><span (click)="deletePerson(j)" class="btn btn-danger">Remove</span></label><br><br>
                </div>                  
            </div>
        </div>
    </div>            
  </div>
</div>
<br><button type="button" (click)="addSegment()" class="btn btn-primary">Add a segment</button>   

Когда я пытаюсь добавить, он добавляет сегмент (идентификатор, время), но не человека (роль, информация) в отличие от нагрузки (изображение ниже), и выдает ошибку: ERROR TypeError: Cannot find control with path: 'segmentRows3 -> 1 -> segmentId3'. Зачем?

enter image description here

1 Ответ

0 голосов
/ 02 мая 2018

Вы добавляете FormArray в segmentRow3 массив, в то время как ваш шаблон ожидает только FormGroup:

segmentRows3.push(this.fb.array([
                  ^^^^^^^^^^^^^^
                       why?
        this.fb.group({

Итак, попробуйте изменить его на:

segmentRows3.push(
  this.fb.group({
    segmentTime3: '',
    segmentId3: '',
    personRows3: this.fb.array([
      this.fb.group({
        personR3: '',
        personI3: ''
      })
    ])
  })
);
...