兩種表單類型使用方法比較

特性
模板驅動表單
響應式表單

引入模組

FormsModule

ReactiveFormsModule

數據模型定義

在組件類中定義一般對象

使用 FormGroup 和 FormControl

基本語法

[(ngModel)]="property"

[formControl]="control"

表單綁定

<form #f="ngForm">

<form [formGroup]="form">

控件綁定

<input [(ngModel)]="name">

<input formControlName="name">

初始化

profile = { name: '' }

form = new FormGroup({ name: new FormControl('') })

訪問值

profile.name

form.get('name').value

驗證方式

<input required minlength="4">

new FormControl('', [Validators.required, Validators.minLength(4)])

提交處理

<form (ngSubmit)="onSubmit(f)">

<form (ngSubmit)="onSubmit()">

狀態訪問

f.valid, f.touched

form.valid, form.touched

對比示例

基本表單設置

模板驅動:

import { FormsModule } from '@angular/forms';

@Component({
  imports: [FormsModule],
  template: `
    <form #f="ngForm" (ngSubmit)="onSubmit(f)">
      <input [(ngModel)]="name" name="name">
    </form>
  `
})
export class AppComponent {
  name = '';
}

響應式:

import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';

@Component({
  imports: [ReactiveFormsModule],
  template: `
    <form [formGroup]="form" (ngSubmit)="onSubmit()">
      <input formControlName="name">
    </form>
  `
})
export class AppComponent {
  form = new FormGroup({
    name: new FormControl('')
  });
}

表單驗證

模板驅動:

<input 
  [(ngModel)]="name"
  name="name"
  required
  minlength="4"
  #nameInput="ngModel"
>
<div *ngIf="nameInput.invalid && nameInput.touched">
  錯誤提示
</div>

響應式:

form = new FormGroup({
  name: new FormControl('', [
    Validators.required,
    Validators.minLength(4)
  ])
});

<input formControlName="name">
<div *ngIf="form.get('name').invalid && form.get('name').touched">
  錯誤提示
</div>

表單提交

模板驅動:

onSubmit(form: NgForm) {
  if (form.valid) {
    console.log(this.name);
  }
}

響應式:

onSubmit() {
  if (this.form.valid) {
    console.log(this.form.value);
  }
}

Last updated