ПРИМЕЧАНИЕ: эта первая часть НЕ для вашей проблемы. В общем, когда вам нужно, форма должна быть похожа на
form=new FormGroup({
name:new FormControl(),
allowedFields:new FormArray([]);
})
Так что сделайте три функции и получатель и объявите переменную форму:
form:FormGroup;
get allowedFields()
{
return this.form.get('allowedFields') as FormArray;
}
getForm(data:any)
{
data=data||{data:null,allowedFields:[]}
return new FormGroup({
name:new FormControl(data.name),
allowedFields:new FormArray(data.allowedFields.map(x=>new FormControl(x)))
})
}
addAllowedField(data:string)
{
this.allowedFields.push(new FormControl(data));
}
removeAlloedField(index)
{
this.allowedFields.removeAt(index)
}
Ваш. html
<form [formGroup]="form" (submit)="submit(form)">
<input formControlName="name">
<div formArrayName="allowedFields">
<button type="button" (click)="addAllowedField(null)">add</button>
<div *ngFor="let control of allowedFields.controls;let i=index" >
<input [formControlName]="i">
<button type="button" (click)="removeAllowedField(i)">remove</button>
</div>
</div>
<button type="submit">submit</button>
</form>
Видите, что вы пишете <div formArrayName="allowedFields">
и перебираете allowedFields.controls
- это "геттер", определенный в .ts. Для управления «входом» вы можете использовать [formControlName]="i"
(или [formControl]="control"
-control - это переменная * ngFor
ЭТА ЧАСТЬ - это ваш ВОПРОС
Но вы хотите серию флажок и отправить и массив с выбранными значениями, так что ваша форма это только два поля массив «позволенных полей», сделайте его массивом объектов, например,
fieldList=[
{id:1,name:"field one"},
{id:2,name:"field two"},
{id:3,name:"field three"},
]
Мы собираемся использовать входные данные, которые не принадлежат к formGroup, да [(ngModel)] в ReactiveForms
<form [formGroup]="form" (submit)="submit(form)">
<input formControlName="name">
<div *ngFor="let item of fieldList;let i=index" >
<input type="checkbox"
[ngModel]="item.check"
(ngModelChange)="item.check=$event;setAllowedFields()"
[ngModelOptions]="{standalone:true}"
>{{item.name}}
</div>
<button type="submit">submit</button>
</form>
И функция
setAllowedFields()
{
this.form.get('allowedFields').setValue(this.fieldList
.filter(x=>x.checked)
.map(x=>x.id))
}
См. stackblitz
Обновление для предварительного заполнения чеков, как всегда, у нас есть функция вернуть формуГруппа
getGroup(data)
{
data=data || {name:'',allowedFields:[]}
//prepopulate the data
this.fieldList.forEach(x=>{
x.check=data.indexOf(x.id>=0)
})
/* //or
allowedField.forEach(x=>{
const field=this.fieldList.find(f=>f.id==x)
if (field)
field.check=true;
})
*/
return new FormGroup({
name:new FormControl(data.name),
allowedFields:new FormControl(data.allowedFields);
})
}
Вы используете как
this.form=this.getGroup(null) //<--a empty form
this.form=this.getGroup(data) //<-- a form with data