Angular 中有两种表单:
Template-driven Forms (类似于 AngularJS 1.x 中的表单 )
Reactive Forms
Template-driven 表单的特点
Reactive 表单的特点
Template-driven vs Reactive 表单
Template-driven 表单
-
模板
-
组件类
-
指令 (FormsModule)
ngForm
ngModel
ngModelGroup
Reactive 表单
-
模板
Form 元素
Input 元素
Form 模型绑定
-
组件类
-
指令 (ReactiveFormsModule)
formGroup
formControl
formControlName
formGroupName
formArrayName
表单控件的状态
-
Value Changed
pristine - 表单控件值未改变
dirty - 表单控件值已改变
-
Validity
valid - 表单控件有效
invalid - 表单控件无效
-
Visited
touched - 表单控件已被访问过
untouched - 表单控件未被访问过
HTML Form vs Template-driven Form vs Reactive Form
HTML Form
<form> <div> <label> <span>用户名</span> <input type="text" name="userName" placeholder="请输入用户名"> </label> </div> ... <button type="submit">注册</button> </form>
Template-driven Form
<form (ngSubmit)="save(signupForm)" #signupForm="ngForm"> <div> <label> <span>用户名</span> <input type="text" name="userName" placeholder="请输入用户名" required minlength="3" [(ngModel)]="user.userName" #userName="ngModel"> </label> <div *ngIf="userName.touched && userName.errors?.required"> 用户名是必填项 </div> <div *ngIf="userName.touched && userName.errors?.minlength"> 用户名的长度必须大于3 </div> </div> ... <button type="submit">注册</button> </form>
Reactive Form
<form (ngSubmit)="save()" [formGroup]="signupForm"> <div> <label> <span>用户名</span> <input type="text" name="userName" placeholder="请输入用户名" formControlName="userName"> </label> <div *ngIf="signupForm.get('userName').touched && signupForm.get('userName').hasError('required')"> 用户名是必填项 </div> <div *ngIf="signupForm.get('userName').touched && signupForm.get('userName').hasError('minlength')"> 用户名的长度必须大于3 </div> </div> ... <button type="submit" [disabled]="signupForm.invalid">注册</button> </form>
接下来我们主要来介绍一下 Reactive Form 的一些相关基础知识。
Reactive Form 简介
使用 Reactive Form
要使用 Reactive Form 需要以下几个步骤:
导入 ReactiveFormsModule
import { ReactiveFormsModule } from "@angular/forms";
@NgModule({ imports: [ BrowserModule,ReactiveFormsModule ],}) export class AppModule { }
绑定 form 元素的
formGroup
属性
<form (ngSubmit)="save()" [formGroup]="signupForm"></form>
关联 input 元素对应的
FormControl
实例
<input type="text" name="userName" placeholder="请输入用户名" formControlName="userName">
使用 FormGroup
创建 FormGroup 属性
创建 FormGroup 实例
创建每个 FormControl 实例
signupForm: FormGroup; this.signupForm = new FormGroup({ userName: new FormControl('',[Validators.required,Validators.minLength(3)]),email: new FormControl('',Validators.email]),... });
使用 FormBuilder
要使用 FormBuilder 需要以下几个步骤:
导入 FormBuilder
注入 FormBuilder 实例
使用 FormBuilder 实例
FormBuilder 创建 Form Control 语法
方式一
this.signupForm = this.fb.group({ userName: 'semlinker',hasAddress: false });
方式二
this.signupForm = this.fb.group({ userName: {value: 'semlinker',disabled: true} hasAddress: {value: true,disabled: false} });
方式三
this.signupForm = this.fb.group({ userName: [''],hasAddress: [{value: true,disabled: false}] })
进阶资源
-
Angular 4.x Template Driven Forms
涉及 ngModel、[ngModel]、[(ngModel)]、ngModelGroup、Template-Driven error validation
-
涉及 FormControl、FormGroup、Reactive Submit、Reactive Forms error validation、FormBuilder
-
Angular 4.x Custom Form Control
涉及 ControlValueAccessor、自定义验证规则等
-
Angular 4.x Creating Dynamic Form
涉及动态创建表单的相关内容
若想进一步阅读更多表单相关的资料,请查看 Angular 4修仙目录 - 表单章节。
原文链接:https://www.f2er.com/angularjs/146953.html