【问题标题】:Function to add a new row of user inputs in Angular form以 Angular 形式添加新的用户输入行的函数
【发布时间】:2019-11-14 01:45:54
【问题描述】:

我有一个表单,我希望用户能够根据需要生成或删除一行输入。解决此问题的最佳方法是什么?我相信我必须将这个 somwhere 包含在我的 html 文件中。 *ngFor="let userline of users".

这是当前表单的外观。当按下绿色“+”时,我想填充一个新行。同样,当单击红色“x”时,我希望删除该行。

form.component.html

<h3 align="center">Requested Dates</h3>
            <!-- PrimeNG InputName -->
            <div class="ui-g form-group">
                <div class="ui-g-12 ui-md-1" id="test">
                    <button pButton type="button" id="deleteButton" icon="pi pi-times" class="ui-button-danger" (click)="onRemoveClicked()"></button>
                </div>


                <div class="ui-g-12 ui-md-2" id="test">
                    <!-- <label for="name">Name</label> -->
                    <input type="text" pInputText name="fname" class="form-control" [(ngModel)]="user.name" placeholder="Name" />
                </div>


                <div class="ui-g-12 ui-md-2">

                    <p-dropdown [options]="leave2" [(ngModel)]="selectedLeave2" (ngModelChange)='setLeave($event)' name="selectedLeave2" placeholder="Select Leave Code *" optionLabel="name"></p-dropdown>
                </div>
<div class="ui-g-12 ui-md-2" id="test">
                    <p-calendar [showIcon]="true" [(ngModel)]="user.fromDate" name="fromDate" placeholder="From Date*" dateFormat="mm.dd.yy">
                    </p-calendar>
                </div>
<div class="ui-g-12 ui-md-1" id="test">
                    <!-- <label for="fromTime">From Time</label> -->
                    <input type="text" pInputText name="lname" class="form-control" [(ngModel)]="user.fromTime" placeholder="From Time*" />
                </div>
<div class="ui-g-12 ui-md-2" id="test">
                    <p-calendar [showIcon]="true" [(ngModel)]="user.toDate" name="toDate" placeholder="To Date*">
                    </p-calendar>
                </div>
<div class="ui-g-12 ui-md-1" id="test">
                    <!-- <label for="toTime">To Time</label> -->
                    <input type="text" pInputText name="lname" class="form-control" [(ngModel)]="user.toTime" placeholder="To Time*" />
                </div>
<br>

                <div class="ui-g-12 ui-md-2" id="test">
                    <input type="submit" value="save" class="btn btn-success">
                </div>
                <button pButton type="button" id="addButton" icon="pi pi-plus" class="ui-button-success" (click)="onAddClicked()"></button>
                <!-- </div> -->
            </div>
        </div>
    </form>

form.component.ts

import { Component, OnInit } from '@angular/core';
import{User}  from '../user';
import{Router}  from '@angular/router';
import{UserService}  from '../shared_service/user.service';

interface Supervisor {
  name: string;
  code: string;
}

interface Leave {
  name: string;
  code: string;
}

@Component({
  selector: 'app-form',
  templateUrl: './form.component.html',
  styleUrls: ['./form.component.css']
})
export class FormComponent implements OnInit {
  private user:User;

  constructor(private _userService:UserService, private _rotuer: Router) {
    this.supervisor2 = [
      { name: 'Samuel Chan', code: 'SC' },
      { name: 'Max Cardone', code: 'MC' },
      { name: 'Kylie Brooks', code: 'KB' },
    ];

    this.leave2 = [
      { name: 'Personal Leave', code: 'PL' },
      { name: 'Sick Leave', code: 'SL' },
      { name: 'Vacation Leave', code: 'VL' },
      { name: 'Any Leave', code: 'AL' }
    ];
  }

  ngOnInit() {
   this.user =this._userService.getter();
   this.user = { id: null , name:'', fromDate: '', fromTime:'', toDate:'', toTime:'', selectedSupervisor2:'', selectedLeave2:'',};
   //this._userService.getter();
  }


  supervisor2: Supervisor [];
  selectedSupervisor2: Supervisor;

  leave2: Leave [];
  selectedLeave2: Leave;

  //  seefromDate(event) {
  //    console.log(event);
  //  }

 // Method to Add row of dates on button click. Will go up to 7 fields
  onAddClicked() {
    if (this.dates.length < 8) {
      this.dates.push({ leaveCode: "", fromDate: "", fromTime: "", toDate: "", toTime: "" })
        ;
    }
  }
  // Method to remove dates on button click. Will always have one date field displayed
  onRemoveClicked() {
    if (this.users.length > 1) { this.users.pop(); }
  }
  setSupervisor(event){
    if (event && event.name)
    this.user.selectedSupervisor2 = (event.name);
  }

  setLeave(event){
    if (event && event.name)
    this.user.selectedLeave2 = (event.name);
  }


  processForm(){

    console.log(this.user);
    if(this.user.id==undefined){
       this._userService.addItem(this.user).subscribe((user)=>{
         console.log(user);
         this._rotuer.navigate(['/table']);
       },(error)=>{
         console.log(error);
       });
    }else{
       this._userService.saveOrUpdateItem(this.user).subscribe((user)=>{
         console.log(user);
         this._rotuer.navigate(['/table']);
       },(error)=>{
         console.log(error);
       });
    }
  }
}

user.ts

export class User {
    id:Number;
    name:String;
    fromDate: String;
    fromTime:String;
    toDate: String;
    toTime:String;
    selectedSupervisor2: String;
    selectedLeave2: String;
}

【问题讨论】:

  • 最好的方法是使用 FormArray
  • @Eliseo 我阅读了有关 FormArray 的 angulars 文档,但是我不确定如何在我的代码中实现它。你介意帮我开始吗?

标签: html angular forms typescript


【解决方案1】:

快速 您在 .ts 中定义一个 FormArray

formArray:FormArray=new FormArray([]);

你有一个返回 formGroup 的函数

getFormGroup(data: User) {
    data = data || ({} as User);
    return new FormGroup({
      id: new FormControl(data.id),
      name: new FormControl(data.name),
      fromDate: new FormControl(data.fromDate),
      fromTime: new FormControl(data.fromTime),
      toDate: new FormControl(data.toDate),
      toTime: new FormControl(data.toTime),
      selectedSupervisor2: new FormControl(data.selectedSupervisor2),
      selectedLeave2: new FormControl(data.selectedLeave2)
    });
  }

然后,在自己的 .html 中可以有一个类似的按钮

<button (click)="formArray.push(getFormGroup(null))">Add</button>

还有.html

<div [formGroup]="formArray">
  <div *ngFor="let group of formArray.controls;let i=index" [formGroup]="group">
    <input formControlName="id">
  <input formControlName="name">
  <input formControlName="fromDate">
  <input formControlName="fromTime">
  <input formControlName="toDate">
  <input formControlName="toTime">
  <input formControlName="selectedSupervisor2">
  <input formControlName="selectedLeave2">
  <button (click)="formArray.removeAt(i)">Remove</button>
  </div>
</div>

你可以在stackblitz看到

别忘了导入 ReactiveFormModule!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2023-02-16
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多