最近在写项目的时候,产品要求对表单的必填输入项进行友好的校验提示,效果如图:
“ 这个需求很简单,怎么实现我不管。 “ ,还能说什么,就是干,具体实现如下:
对Angular内置的表单css属性设置想要的样式
1// css样式2.isvalid {3border: 1px dashed red ;4}html文件里设置即时样式检测
[class.isvalid]1<!--非formArray-->2<input formControlName="addressName [class.isvalid]="isFieldInvalidTouched('addressName')" type="text" placeholder="请输入收件人姓名">3<!--formArray-->4<input formControlName="addressName [class.isvalid]="isArrayFieldInvalidTouched(i, 'addressName')" type="text" placeholder="请输入收件人姓名">ts文件里注入核心方法
1// 表单字段校验2validateAllFormFields(formGroup: any) {3Object.keys(formGroup.controls).forEach(field => {4const control = formGroup.get(field);5if (control instanceof FormControl) {6control.markAsTouched({ onlySelf: true });7} else if (control instanceof FormGroup) {8this.validateAllFormFields(control);9} else if (control instanceof FormArray) {10this.validateAllFormFields(control);11}12});13}1415// 表单控件校验16isFieldInvalidTouched(field: any) {17return this.form.get(field).invalid && this.form.get(field).touched;18}1920// 表单控件校验21isArrayFieldInvalidTouched(index, field: any) {22return this.xxxArray.controls[index].get(field).invalid &&this.xxxArray.controls[index].get(field).touched;23}2425// 获取FormArray26get xxxArray(): FormArray {27return this.form.get('xxxArray') as FormArray;28}2930// 设置FormArray31set setXxxArray() {32// TODO33}3435// 表单提交36ensure() {37if (!this.form.valid) {38this.validateAllFormFields(this.form);39this.orderService.presentToast('表单信息不全, 请填写完整~');40} else {41// TODO42}43}