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 Documentationget()的签名是:
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>