import { Component, OnInit } from '@angular/core'; import { FormGroup, FormBuilder, Validators, FormArray } from '@angular/forms'; @Component({ selector: 'app-advanced-form', templateUrl: './advanced-form.component.html' }) export class AdvancedFormComponent implements OnInit { editIndex = -1; editObj = {}; form: FormGroup; users: any[] = [ { value: 'xiao', label: '付晓晓' }, { value: 'mao', label: '周毛毛' } ]; constructor(private fb: FormBuilder) {} ngOnInit() { this.form = this.fb.group({ name: [null, [Validators.required]], url: [null, [Validators.required]], owner: [undefined, [Validators.required]], approver : [null, [Validators.required]], time_start : [null, [Validators.required]], time_end : [null, [Validators.required]], type : [null, [Validators.required]], name2 : [null, [Validators.required]], summary : [null, [Validators.required]], owner2 : [null, [Validators.required]], approver2 : [null, [Validators.required]], time : [null, [Validators.required]], type2 : [null, [Validators.required]], items: this.fb.array([]) }); const userList = [ { key: '1', workId: '00001', name: 'John Brown', department: 'New York No. 1 Lake Park', }, { key: '2', workId: '00002', name: 'Jim Green', department: 'London No. 1 Lake Park', }, { key: '3', workId: '00003', name: 'Joe Black', department: 'Sidney No. 1 Lake Park', } ]; userList.forEach(i => { const field = this.createUser(); field.patchValue(i); this.items.push(field); }); } createUser(): FormGroup { return this.fb.group({ key: [ null ], workId: [ null, [ Validators.required ] ], name: [ null, [ Validators.required ] ], department: [ null, [ Validators.required ] ] }); } //#region get form fields get name() { return this.form.controls.name; } get url() { return this.form.controls.url; } get owner() { return this.form.controls.owner; } get approver() { return this.form.controls.approver; } get time_start() { return this.form.controls.time_start; } get time_end() { return this.form.controls.time_end; } get type() { return this.form.controls.type; } get name2() { return this.form.controls.name2; } get summary() { return this.form.controls.summary; } get owner2() { return this.form.controls.owner2; } get approver2() { return this.form.controls.approver2; } get time() { return this.form.controls.time; } get type2() { return this.form.controls.type2; } get items() { return this.form.controls.items as FormArray; } //#endregion add() { this.items.push(this.createUser()); this.edit(this.items.length - 1); } del(index: number) { this.items.removeAt(index); } edit(index: number) { if (this.editIndex !== -1 && this.editObj) { this.items.at(this.editIndex).patchValue(this.editObj); } this.editObj = { ...this.items.at(index).value }; this.editIndex = index; } save(index: number) { this.items.at(index).markAsDirty(); if (this.items.at(index).invalid) return ; this.editIndex = -1; } cancel(index: number) { if (!this.items.at(index).value.key) { this.del(index); } else { this.items.at(index).patchValue(this.editObj); } this.editIndex = -1; } _submitForm() { console.log(this.form.value); for (const i in this.form.controls) { this.form.controls[ i ].markAsDirty(); } if (this.form.invalid) return ; } }