Вам нужно использовать FormArray. Я полагаю, что вы хотите сделать что-то вроде
formArray:FormArray=new FormArray([this.newLine()]);
newLine() //This funcrion is WORNG, see update 2
{
return this.formBuilder.group({
onValues: [
{ value: "" },
[Validators.required, Validators.pattern(/^[+-]?\d+(\.\d+)?$/)]
],
ruleTypeValues: [{ value: "" }],
getType: [{ value: "" }],
filterValue: [{ value: "" }]
})
}
addLine()
{
this.formArray.push(this.newLine())
}
removeLine(index)
{
this.formArray.removeAt(index)
}
Для управления посмотрите на formArray.controls, используя [formGroup]
<form class="form" [formGroup]="formArray">
<div *ngFor="let group of formArray.controls;let i=index" [formGroup]="group" class="rows">
<div class="clr-select-wrapper">
<select formControlName="getType">
<ng-container *ngFor="let val of rootName">
<option [ngValue]="val">{{ val }}</option>
</ng-container>
</select>
</div>
<div class="clr-select-wrapper">
<select formControlName="ruleTypeValues">
<ng-container *ngFor="let val of ruleType">
<option [ngValue]="val">{{ val }}</option>
</ng-container>
</select>
</div>
<div class="clr-select-wrapper" *ngIf="getValues.length > 0">
<select formControlName="onValues">
<ng-container *ngFor="let val of getValues">
<option [ngValue]="val">{{ val }}</option>
</ng-container>
</select>
</div>
<input
*ngIf="getValues.length === 0"
type="text"
formControlName="filterValue"
class="text"
placeholder="sdf"
/>
<div class="row-button">
<button (click)="addLine()">Add row</button>
<button (click)="removeLine(i)">Remove row </button>
<button (click)="addBlock(row)">Add block</button>
</div>
</div>
</form>
Обновление , чтобы подписаться на valueChanges Для formGroup нам нужно изменить функцию newLine и сделать ее в два этапа:
newLine()
{
const group=this.formBuilder.group({
onValues: [
{ value: "" },
[Validators.required, Validators.pattern(/^[+-]?\d+(\.\d+)?$/)]
],
ruleTypeValues: [{ value: "" }],
getType: [{ value: "" }],
filterValue: [{ value: "" }]
})
group.valuesChange.subscribe((res:any)=>{
..here the code
}
//or, if we only want to check, e.g. "getType"
group.get('getType').valueChange.subscribe((res:any)=>{
..here the code
}
return group;
}
ИЛИ, после создания формы, например, в ngOnInit
ngOnInit()
{
this.formArray.valueChanges.subcribe((res:any)=>{
..here the code..
}
}
Update2 функция newLine неверна !!!
должно быть похоже на
newLine(){
const group=this.formBuilder.group({
onValues: ["",
[Validators.required, Validators.pattern(/^[+-]?\d+(\.\d+)?$/)]
],
ruleTypeValues: [""],
getType: [""],
filterValue: [""]
})
return group
}