Я не могу толкать массиву.
У меня есть сегмент (идентификатор, время), в котором может быть один или несколько человек (роль, информация). Поле генерируется динамически. При загрузке на странице отображаются поля (см. Изображение ниже) .
При попытке добавить сегмент получаю ошибку: 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'
. Почему?
Вы добавляете 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: ''
})
])
})
);