angular 4 nested formArray Cannot find control with path: 'segmentRows3 -> 1 -> segmentId3'

試著忘記壹切 提交于 2019-12-11 14:22:10

问题


I cannot push to an array. I have a segment(id, time) that can have one or several people (role, infos). The field are generated dynamically. On load the page shows the fields (see image below).

When try to add a segment I get error : ERROR TypeError: Cannot find control with path: 'segmentRows3 -> 1 -> segmentId3'
Here is code from the .ts file:

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: ''
          })
        ])
    })
  ]),

The .html code

<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>   

When i try to add it adds the segment(id, time) but not the person (role, infos) unlike on load (image below), and throws error : ERROR TypeError: Cannot find control with path: 'segmentRows3 -> 1 -> segmentId3' . Why?


回答1:


You're adding FormArray to segmentRow3 array whilst your template expects only FormGroup:

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

So, try changing it to:

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


来源:https://stackoverflow.com/questions/50122957/angular-4-nested-formarray-cannot-find-control-with-path-segmentrows3-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!