Angular 两个 FormArray 内的嵌套 formGroup 中的 12 个 FormControl
Angular 12 FormControls in nested formGroup inside of two FormArrays
我正在尝试构建具有这种结构的动态表单:
Form
-|FormGroup
--|FormArray
---|FormGroup
----|FormControl
----|FormArray
-----|FormGroup
------|FormControl <-- Problem that I cannot bind this form control to input
------|FomrControl <-- Problem that I cannot bind this form control to input
在两个指定的控件上出现错误
Cannot find control with path: 'items -> 0 -> properties -> 1'
我猜可能是因为 let rowItem of items.controls[i].value.properties; let j=index
有问题
尝试了很多不同的方案都没有成功。例如:
let rowItem of items.controls[i].properties; let j=index
给予
Property 'properties' does not exist on type 'AbstractControl'.
在 StackBlitz 上,它也无法正常工作。
如能提供有关如何将这些 FormControl 连接到输入的建议,我将不胜感激。
Html代码:
<form [formGroup]="myForm">
<div formArrayName="items">
<div *ngFor="let item of items.controls; let i=index">
<div [formGroupName]="i">
<input formControlName="word" matInput>
<div formArrayName="properties">
<div *ngFor="let rowItem of items.controls[i].value.properties; let j=index">
<div [formGroupName]="j">
<input formControlName="property" matInput>
<input formControlName="value" matInput>
</div>
</div>
<br>
</div>
<button (click)="addWordProperty(items.controls[i].value.properties)">Add property</button>
<br>
</div>
</div>
<button (click)="addWord()">Add word</button>
</div>
</form>
{{ myForm.value | json }}
键入脚本代码:
import { Component} from '@angular/core';
import { FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms';
@Component({
selector: 'app-infinitive',
templateUrl: './infinitive.component.html',
styleUrls: ['./infinitive.component.css']
})
export class InfinitiveComponent {
myForm: FormGroup;
constructor(private fb: FormBuilder) {
this.myForm = this.fb.group({
items: this.fb.array([
this.fb.group({
word: this.fb.control(''),
properties: this.fb.array([
this.fb.group({
property: this.fb.control(''),
value: this.fb.control('')
})
]),
})
])
})
}
addWordProperty(control: any) {
var items = control as FormArray;
items.push(this.fb.control(''));
}
addWord() {
var array = this.myForm.get('items') as FormArray;
array.push(this.fb.group({
word: this.fb.control(''),
properties: this.fb.array([
this.fb.group({
property: this.fb.control(''),
value: this.fb.control('')
})
]),
}));
}
get items() {
return this.myForm.get('items') as FormArray;
}
}
<form [formGroup]="myForm">
<div formArrayName="items">
<div *ngFor="let item of items.controls; let i=index">
<div [formGroupName]="i">
<input formControlName="word" matInput>
<div formArrayName="properties">
<div *ngFor="let rowItem of items.controls[i].controls['properties'].controls; let j=index">
<div [formGroupName]="j">
<input formControlName="property" matInput>
<input formControlName="value" matInput>
</div>
</div>
<br>
</div>
<button (click)="addWordProperty(items.controls[i].value.properties)">Add property</button>
<br>
</div>
</div>
<button (click)="addWord()">Add word</button>
</div>
</form>
我正在尝试构建具有这种结构的动态表单:
Form
-|FormGroup
--|FormArray
---|FormGroup
----|FormControl
----|FormArray
-----|FormGroup
------|FormControl <-- Problem that I cannot bind this form control to input
------|FomrControl <-- Problem that I cannot bind this form control to input
在两个指定的控件上出现错误
Cannot find control with path: 'items -> 0 -> properties -> 1'
我猜可能是因为 let rowItem of items.controls[i].value.properties; let j=index
尝试了很多不同的方案都没有成功。例如:
let rowItem of items.controls[i].properties; let j=index
给予
Property 'properties' does not exist on type 'AbstractControl'.
在 StackBlitz 上,它也无法正常工作。
如能提供有关如何将这些 FormControl 连接到输入的建议,我将不胜感激。
Html代码:
<form [formGroup]="myForm">
<div formArrayName="items">
<div *ngFor="let item of items.controls; let i=index">
<div [formGroupName]="i">
<input formControlName="word" matInput>
<div formArrayName="properties">
<div *ngFor="let rowItem of items.controls[i].value.properties; let j=index">
<div [formGroupName]="j">
<input formControlName="property" matInput>
<input formControlName="value" matInput>
</div>
</div>
<br>
</div>
<button (click)="addWordProperty(items.controls[i].value.properties)">Add property</button>
<br>
</div>
</div>
<button (click)="addWord()">Add word</button>
</div>
</form>
{{ myForm.value | json }}
键入脚本代码:
import { Component} from '@angular/core';
import { FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms';
@Component({
selector: 'app-infinitive',
templateUrl: './infinitive.component.html',
styleUrls: ['./infinitive.component.css']
})
export class InfinitiveComponent {
myForm: FormGroup;
constructor(private fb: FormBuilder) {
this.myForm = this.fb.group({
items: this.fb.array([
this.fb.group({
word: this.fb.control(''),
properties: this.fb.array([
this.fb.group({
property: this.fb.control(''),
value: this.fb.control('')
})
]),
})
])
})
}
addWordProperty(control: any) {
var items = control as FormArray;
items.push(this.fb.control(''));
}
addWord() {
var array = this.myForm.get('items') as FormArray;
array.push(this.fb.group({
word: this.fb.control(''),
properties: this.fb.array([
this.fb.group({
property: this.fb.control(''),
value: this.fb.control('')
})
]),
}));
}
get items() {
return this.myForm.get('items') as FormArray;
}
}
<form [formGroup]="myForm">
<div formArrayName="items">
<div *ngFor="let item of items.controls; let i=index">
<div [formGroupName]="i">
<input formControlName="word" matInput>
<div formArrayName="properties">
<div *ngFor="let rowItem of items.controls[i].controls['properties'].controls; let j=index">
<div [formGroupName]="j">
<input formControlName="property" matInput>
<input formControlName="value" matInput>
</div>
</div>
<br>
</div>
<button (click)="addWordProperty(items.controls[i].value.properties)">Add property</button>
<br>
</div>
</div>
<button (click)="addWord()">Add word</button>
</div>
</form>