角度反应形式,添加和删除字段?

Que*_*ns 4 angular angular-reactive-forms

虽然在角度5中构建crud应用程序我遇到了一个问题,我如何使用相同的表单生成器但是根据我的需要更改我得到的控件,通过表单添加或更新用户...

这里有一些简单的代码,我会尽量不使事情变得复杂,因为我有很多属性很大的形式......

所以在我的app.component.html我有表格

         <form class="form-horizontal" [formGroup]="form" #myForm="ngForm" 
          (ngSubmit)="save()"> 
                <div class="form-group">
                    <label for="firstName" class="control-label 
                  required">First name</label>
                    <input type="text" id="firstName" class="form-control" 
             formControlName="firstName">


                </div>

                <div class="form-group">
                    <label for="lastName" class="control-label 
            required">Last name</label>
                    <input type="text" id="lastName" class="form-control" 
            formControlName="lastName"> 
                </div>
Run Code Online (Sandbox Code Playgroud)

在我的app.component.ts中

在我的构造函数中我有

    this.form = this.formBuilder.group({ 
        firstName: ['', [Validators.required, Validators.minLength(2), 
   Validators.pattern(/^[a-zA-Z]+$/)]],
        lastName: ['', [Validators.required, Validators.minLength(2), 
   Validators.pattern(/^[a-zA-Z]+$/)]],

    });
Run Code Online (Sandbox Code Playgroud)

和save()函数用于提交表单

    save() {
    let formModel = this.form.value;
    formModel.id = this.Id;

    if (this.Id == null) { 
        this._usermanagementservice.addEmployee(formModel).subscribe(() => {

           //function that reloads table with employees
            this.LoadAllEmployees();
        });
    }
    else {
        this._usermanagementservice.updateEmployee(this.Id, formModel).subscribe(() => {
            this.LoadAllEmployees();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

注意到一切正常,我没有包括其他字段,但问题是,如何在添加用户时仅包含名字字段的表单,并且只有更新的姓氏?(为了简单起见,我使用这个例子的名字和姓氏)

谢谢,如果您需要更多信息,我很乐意提供Ps.英语是我的第二语言,因此字段,表格等术语肯定是不正确的,希望你能明白这一点

vin*_*nce 16

FormGroupAPI公开的方法,如addControlremoveControl您可以使用它已被初始化后,从表单组中添加或删除控件.

使用这些方法的示例可能如下所示:

formMode: 'add' | 'update';
userForm: FormGroup;

ngOnInit() {
  this.form = this.formBuilder.group({ 
    firstName: [''],
    lastName: ['']
  });
}

changeMode(mode: 'add' | 'update') {
  if (mode === 'add') {
    if (!this.form.get('firstName')) {
      this.form.addControl('firstName');
    }
    this.form.removeControl('lastName');
  } else {
    if (!this.form.get('lastName')) {
      this.form.addControl('lastName');
    }
    this.form.removeControl('firstName');
  }
}

onChange(event: 'add' | 'update') {
  this.changeMode(event);
}
Run Code Online (Sandbox Code Playgroud)

您可能希望您的DOM通过*ngIf根据给定控件的存在添加检查来反映表单的状态:

<input *ngIf="form.get('lastName')" formControlName="lastName"> 
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个问题是因为如果使用 addControl 动态调整输入,我不明白如何使用 formControlName 。我的输入被隐藏了,但它仍然导致问题。感谢您建议使用 *ngIf。 (2认同)

小智 1

首先,您可以根据您的选择创建一组模板。我们可以在模板中使用*ngIf来隐藏和显示表单中的元素组。然后使用formBuilder创建表单的表单实例,每次仅传递那些启用的表单控件的对象。

模板

<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<label for="name">First Name:</label>
<input type="text" formControlName="fname"
placeholder="Enter name">
<br /><br />
<div *ngIf="lNameEmail1">
<label for="name">Last Name:</label>
<input type="text" formControlName="lname"
placeholder="Enter name">
<br /><br />
<label for="email">Email:</label>
<input type="email" formControlName="email"
placeholder="Enter email">
</div>
<div *ngIf="lNameEmail2">
<label for="name">Last Name2:</label>
<input type="text" formControlName="lname2"
placeholder="Enter name">

<br /><br />

<label for="email">Email2:</label>
<input type="email" formControlName="email2"
placeholder="Enter email">
</div>
<br /><br />
<button type="submit" [disabled]="!myForm.valid">Submit
</button>
<button type="submit" (click)='formGrp1()'> Form 1</button>
<button type="submit" (click)='formGrp2()'> Form 2</button>
</form> 
Run Code Online (Sandbox Code Playgroud)

角类

export class AppComponent implements AfterViewInit {
        public myForm: FormGroup;
        lNameEmail1 = false;
        lNameEmail2 = false;
        myFormProperty1 = {
        "fname": new FormControl("", Validators.required)
        };

        myFormProperty2 = {
        "fname": new FormControl("", Validators.required),
        "lname": new FormControl("", Validators.required),
        "email": new FormControl("")

        };
        myFormProperty3 = {
        "fname": new FormControl("", Validators.required),
        "lname2": new FormControl("", Validators.required),
        "email2": new FormControl("")

        };

        constructor(public fb: FormBuilder) {
        this.myForm = this.fb.group(this.myFormProperty1);
        }


        formGrp1(){
        alert('Form 1 enable')

        this.lNameEmail1 = true;
        this.lNameEmail2 = false;

        this.myForm = this.fb.group(this.myFormProperty2);


        this.myForm.valueChanges.subscribe(data =>
        console.log('form object ====' + JSON.stringify(data)
        )); 
        }
        formGrp2(){
        alert('Form 2 enable')
        this.lNameEmail1 = false;
        this.lNameEmail2 = true;

        this.myForm = this.fb.group(this.myFormProperty3);

        this.myForm.valueChanges.subscribe(data =>
        console.log('form object ====' + JSON.stringify(data)
        )); 

        }
        onSubmit() {
        console.log('Form submitted Value=='+ JSON.stringify(this.myForm.value));
        }

    }
Run Code Online (Sandbox Code Playgroud)