表单提交,表单所有校验成功才能提交,当表单校验错误,表单边框变红,同时有错误提示信息,有重置功能javascript
本案例中使用了响应式表单,响应式表单在表单的校验方面很是方便java
要使用响应式表单,就要从 @angular/forms 包中导入 ReactiveFormsModule 并把它添加到你的 NgModule 的 imports 数组中。git
app.module.tsgithub
imports: [ BrowserModule, AppRoutingModule, ReactiveFormsModule ]
当须要与多个表单打交道时,手动建立多个表单控件实例会很是繁琐。FormBuilder 服务提供了一些便捷方法来生成表单控件。FormBuilder 在幕后也使用一样的方式来建立和返回这些实例,只是用起来更简单。数组
constructor( private fb: FormBuilder ) { }
FormBuilder 提供了一个语法糖,以简化 FormControl、FormGroup 或 FormArray 实例的建立过程。它会减小构建复杂表单时所需的样板代码的数量(new FormControl)。app
formGroup: FormGroup; this.formGroup = this.fb.group({ name: '', age: '', sex: '' });
formGroup 是一个输入指令,它接受一个 formGroup 实例,它会使用这个 formGroup 实例去匹配 FormControl、FormGroup、FormArray 实例,因此模版中的 formControlName 必须和 formGroup 中的 name 匹配。ui
<form [formGroup]="formGroup" (ngSubmit)="submit()" novalidate> <div class="form-group"> <label>姓名:</label> <input type="text" formControlName="name"> <p>{{nameErrorMessage}}</p> </div> </form>
每一个表单控件都有本身的状态,共五个状态属性,都是布尔值。this
以输入姓名的表单为例,只验证该表单的必填项时。表单先获取焦点而且输入姓名,最后移除焦点,每一步表单的状态以下:code
初始状态 | |
---|---|
状态 | 值 |
valid | false |
pristine | true |
dirty | false |
touched | false |
untouched | true |
输入状态 | |
---|---|
状态 | 值 |
valid | true |
pristine | false |
dirty | true |
touched | false |
untouched | true |
失去焦点后状态 | |
---|---|
状态 | 值 |
valid | true |
pristine | false |
dirty | true |
touched | true |
untouched | true |
表单验证用于验证用户的输入,以确保其完整和正确。Angular内置的了一些校验器,如 Validators.required, Validators.maxlength,Validators.minlength, Validators.pattern,可是不能自定义错误提示信息,因此实用性不强,知足不了业务场景的需求,因而咱们能够自定义表单校验器。component
name-validator.ts
import { AbstractControl, ValidatorFn } from '@angular/forms'; export function nameValidator(): ValidatorFn { return (control: AbstractControl): { [key: string]: any } => { if (!control.value) { return { message: '请输入必选项' }; } if (control.value.length > 10) { return { message: '名称大于10位了' }; } return null; }; }
app.component.ts
this.formGroup = this.fb.group({ name: ['', nameValidator()], age: ['', ageValidator()], sex: ['', sexValidator()] });
当页面初始化的时候不该该显示错误信息,也就是表单touched为true
// Error private errorMessage(name): string { const control = this.formGroup.controls[name]; return (control.touched && control.invalid) ? control.errors.message : ''; }
然而touched只有失去焦点才为true,在输入的时候一直为false。致使在输入的时候,表单校验错误,却显示不了错误信息。所以须要再次判断 dirty 状态,只要表单值改变,则为false
private errorMessage(name): string { const control = this.formGroup.controls[name]; return ((control.touched || control.dirty) && control.invalid) ? control.errors.message : ''; }
未对表单操做时,点击提交按钮时,则模拟表单被touched,显示提示信息
markFormGroupTouched(formGroup: FormGroup) { (<any>Object).values(formGroup.controls).forEach(item => { if (item.controls) { this.markFormGroupTouched(item); } else { item.markAsTouched(); } }); }