【问题标题】:Angular 4 Form FormArray Add a Button to add or delete a form input rowAngular 4 Form FormArray 添加按钮以添加或删除表单输入行
【发布时间】:2017-09-17 02:47:39
【问题描述】:

我正在使用 Angular 4.0.2 构建应用程序。如何向表单添加按钮以添加新的输入行和删除特定行的删除按钮?我的意思是我想要一个像这样的表格。我希望我的表单看起来像这样:

.

这是我的代码:

添加发票.component.html

    <h3 class="page-header">Add Invoice</h3>
    <form [formGroup]="invoiceForm">
      <div formArrayName="itemRows">
        <div *ngFor="let itemrow of itemRows.controls; let i=index" [formGroupName]="i">
          <h4>Invoice Row #{{ i + 1 }}</h4>
          <div class="form-group">
            <label>Item Name</label>
            <input formControlName="itemname" class="form-control">
          </div>
          <div class="form-group">
            <label>Quantity</label>
            <input formControlName="itemqty" class="form-control">
          </div>
          <div class="form-group">
             <label>Unit Cost</label>
             <input formControlName="itemrate" class="form-control">
          </div>
          <div class="form-group">
            <label>Tax</label>
            <input formControlName="itemtax" class="form-control">
          </div>
          <div class="form-group">
            <label>Amount</label>
            <input formControlName="amount" class="form-control">
          </div>
          <button *ngIf="i > 1" (click)="deleteRow(i)" class="btn btn-danger">Delete Button</button>
        </div>
      </div>
      <button type="button" (click)="addNewRow()" class="btn btn-primary">Add new Row</button>
    </form>
    <p>{{invoiceForm.value | json}}</p>

这是我的 add-invoice.component.ts 代码

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormControl, FormArray, FormGroup } from '@angular/forms';

@Component({
  selector: 'app-add-invoice',
  templateUrl: './add-invoice.component.html',
  styleUrls: ['./add-invoice.component.css']
})

export class AddInvoiceComponent implements OnInit {
  invoiceForm: FormGroup;

  constructor(
    private _fb: FormBuilder
  ) {
    this.createForm();
  }

  createForm(){
    this.invoiceForm = this._fb.group({
      itemRows: this._fb.array([])
    });
    this.invoiceForm.setControl('itemRows', this._fb.array([]));
  }

  get itemRows(): FormArray {
    return this.invoiceForm.get('itemRows') as FormArray;
  }

  addNewRow(){
    this.itemRows.push(this._fb.group(itemrow));
  }

  ngOnInit(){

  }
}

【问题讨论】:

  • 请输入代码,你试过什么?
  • 我一直在阅读 angular.io 上的响应式表单文档,但没有任何效果,请您为我编写代码。
  • 我可以,但这不是编码服务,您需要向我们展示您的努力。
  • 好的,请稍等,我提供给你
  • 请等待 10-15 分钟,我会编译给你看。

标签: forms angular angular2-forms


【解决方案1】:

这是您的代码的简化版本:

当你初始化你的表单时,你可以在你的 formArray 中添加一个空的表单组:

ngOnInit() {
  this.invoiceForm = this._fb.group({
    itemRows: this._fb.array([this.initItemRows()])
  });
}

get formArr() {
  return this.invoiceForm.get('itemRows') as FormArray;
}

然后是函数:

initItemRows() {
  return this._fb.group({
    // list all your form controls here, which belongs to your form array
    itemname: ['']
  });
}

这是addNewRowdeleteRow 函数:

addNewRow() {
  this.formArr.push(this.initItemRows());
}

deleteRow(index: number) {
  this.formArr.removeAt(index);
}

您的表单应如下所示:

<form [formGroup]="invoiceForm">
  <div formArrayName="itemRows">
    <div *ngFor="let itemrow of formArr.controls; let i=index"  [formGroupName]="i">
      <h4>Invoice Row #{{ i + 1 }}</h4>
      <div>
        <label>Item Name</label>
        <input formControlName="itemname">
      </div>
      <button type="button" (click)="deleteRow(i)" *ngIf="formArr.controls.length > 1" >
        Delete
      </button>
    </div>
  </div>
  <button type="button" (click)="addNewRow()">Add new Row</button>
</form>

这是一个

DEMO

【讨论】:

  • 有没有办法以模板驱动的形式做到这一点。
  • 在这种情况下,我建议您使用模型驱动形式,但我认为这种方式更简洁。
  • 我刚刚发布了另一个问题。也请帮助我。我会非常感谢你。
  • 好的,我可以看看:)
  • 这只是一个通过按钮。兄弟,真的很感谢你的回答。当我的第一份薪水到来时,我一定会请你喝啤酒。对了,请通过stackoverflow.com/q/43528200/7882245
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多