Angular 2: 从 FormArray 访问数据
Angular 2: Accessing data from FormArray
我已经使用 angular2/forms 提供的 ReactiveForms 准备了一个。此表单有一个表单数组产品:
this.checkoutFormGroup = this.fb.group({
selectedNominee: ['', Validators.required],
selectedBank: ['', Validators.required],
products: productFormGroupArray
});
productFormGroupArray 是 FormGroup 的数组 Objects.I 使用此获取控件,即 FormArray 对象:
this.checkoutFormGroup.get('products')
我正在尝试获取索引 i
处的产品数组中的元素。如何在不循环遍历数组的情况下完成此操作?
编辑:
我尝试使用可用的 at(index) 方法:
this.checkoutFormGroup.get('products').at(index)
但这会产生一个错误:
Property 'at' does not exist on type 'AbstractControl'.
编辑 2:
从服务器接收结帐数据和资金。
this.checkoutData.products.forEach(product => {
this.fundFormGroupArray.push(this.fb.group({
investmentAmount: [this.fund.minInvestment, Validators.required],
selectedSubOption: ['', Validators.required],
}))
});
只需将该控件转换为数组
var arrayControl = this.checkoutFormGroup.get('products') as FormArray;
它的所有功能都在那里
var item = arrayControl.at(index);
一个班轮作为当前接受的答案的一个选项
var item = (<FormArray>this.checkoutFormGroup.get('products')).at(index);
// 在.ts 组件文件中 //
getName(i) {
return this.getControls()[i].value.name;
}
getControls() {
return (<FormArray>this.categoryForm.get('categories')).controls;
}
// 反应形式 - 模板文件 //
<mat-tab-group formArrayName="categories" class="uk-width-2-3" [selectedIndex]="getControls().length">
<mat-tab
*ngFor="let categoryCtrl of getControls(); let i = index"
[formGroupName]="i"
[label]="getName(i)? getName(i) : 'جديد'"
>
</mat-tab>
</mat-tab-group>
虽然在使用 at()
方法之前将 AbstractControl 转换为 FormArray 是一种方法,但我还没有看到任何人指出您也可以使用 get()
方法来做到这一点,不需要铸造。
根据Angular's Documentation,get()
的签名是:
get(path: string | (string | number)[]): AbstractControl | null
这意味着您还可以使用它访问 FormArray 的控件。
示例:
const formGroup = new FormGroup({
list: new FormArray([
new FormControl('first'),
new FormControl('second'),
]),
});
const firstValue = formGroup.get('list.0').value; // Returns 'first'
const secondValue = formGroup.get('list.1').value; // Returns 'second'
这真的很有用,当你想在 HTML 中绑定一个 FormControl 时,你不能在其中投射任何东西:
<input [formControl]="formGroup.get('list.0')">
以下是实现方法的总结:
const firstControl = listControl.get('list.0');
const firstControl = listControl.get(['list', 0]);
const firstControl = listControl.get('list').get('0'); // You need a string and not a number
const listControl = formGroup.get('list') as FormArray;
const firstControl = listControl.at(0);
组件内部:使用这个
(<FormArray>this.checkoutFormGroup.get('products')).at(index).get('yourFormControlName')
在 DOM 中(在表单控件上应用验证)以这种方式使用它:
<form (ngSubmit)="onSubmit()" [formGroup]="checkoutFormGroup">
<div>
<h4 >Add Products Below</h4>
<div formArrayName="products">
<div *ngFor="let subFormGroup of getControls(); let i = index">
<div class="expense__input" [formGroupName]="i">
<div class="input__group">
<label for="Expense Type">Expense Type</label>
<input type="text"
formControlName="productType">
<span *ngIf="this.expenseForm.get('products').at(i).get('products').invalid">Product Type is Required</span>
</div>
</div>
</div>
</div>
</div>
我已经使用 angular2/forms 提供的 ReactiveForms 准备了一个。此表单有一个表单数组产品:
this.checkoutFormGroup = this.fb.group({
selectedNominee: ['', Validators.required],
selectedBank: ['', Validators.required],
products: productFormGroupArray
});
productFormGroupArray 是 FormGroup 的数组 Objects.I 使用此获取控件,即 FormArray 对象:
this.checkoutFormGroup.get('products')
我正在尝试获取索引 i
处的产品数组中的元素。如何在不循环遍历数组的情况下完成此操作?
编辑:
我尝试使用可用的 at(index) 方法:
this.checkoutFormGroup.get('products').at(index)
但这会产生一个错误:
Property 'at' does not exist on type 'AbstractControl'.
编辑 2: 从服务器接收结帐数据和资金。
this.checkoutData.products.forEach(product => {
this.fundFormGroupArray.push(this.fb.group({
investmentAmount: [this.fund.minInvestment, Validators.required],
selectedSubOption: ['', Validators.required],
}))
});
只需将该控件转换为数组
var arrayControl = this.checkoutFormGroup.get('products') as FormArray;
它的所有功能都在那里
var item = arrayControl.at(index);
一个班轮作为当前接受的答案的一个选项
var item = (<FormArray>this.checkoutFormGroup.get('products')).at(index);
// 在.ts 组件文件中 //
getName(i) {
return this.getControls()[i].value.name;
}
getControls() {
return (<FormArray>this.categoryForm.get('categories')).controls;
}
// 反应形式 - 模板文件 //
<mat-tab-group formArrayName="categories" class="uk-width-2-3" [selectedIndex]="getControls().length">
<mat-tab
*ngFor="let categoryCtrl of getControls(); let i = index"
[formGroupName]="i"
[label]="getName(i)? getName(i) : 'جديد'"
>
</mat-tab>
</mat-tab-group>
虽然在使用 at()
方法之前将 AbstractControl 转换为 FormArray 是一种方法,但我还没有看到任何人指出您也可以使用 get()
方法来做到这一点,不需要铸造。
根据Angular's Documentation,get()
的签名是:
get(path: string | (string | number)[]): AbstractControl | null
这意味着您还可以使用它访问 FormArray 的控件。
示例:
const formGroup = new FormGroup({
list: new FormArray([
new FormControl('first'),
new FormControl('second'),
]),
});
const firstValue = formGroup.get('list.0').value; // Returns 'first'
const secondValue = formGroup.get('list.1').value; // Returns 'second'
这真的很有用,当你想在 HTML 中绑定一个 FormControl 时,你不能在其中投射任何东西:
<input [formControl]="formGroup.get('list.0')">
以下是实现方法的总结:
const firstControl = listControl.get('list.0');
const firstControl = listControl.get(['list', 0]);
const firstControl = listControl.get('list').get('0'); // You need a string and not a number
const listControl = formGroup.get('list') as FormArray;
const firstControl = listControl.at(0);
组件内部:使用这个
(<FormArray>this.checkoutFormGroup.get('products')).at(index).get('yourFormControlName')
在 DOM 中(在表单控件上应用验证)以这种方式使用它:
<form (ngSubmit)="onSubmit()" [formGroup]="checkoutFormGroup">
<div>
<h4 >Add Products Below</h4>
<div formArrayName="products">
<div *ngFor="let subFormGroup of getControls(); let i = index">
<div class="expense__input" [formGroupName]="i">
<div class="input__group">
<label for="Expense Type">Expense Type</label>
<input type="text"
formControlName="productType">
<span *ngIf="this.expenseForm.get('products').at(i).get('products').invalid">Product Type is Required</span>
</div>
</div>
</div>
</div>
</div>