本文参考地址:连接javascript
第三方UI组件:Ant-Designhtml
近期在作angular的表单,目前项目上已经升级到angular 5了,须要作一些自定义表单验证,用户输入的是在服务器上的绝对路径,因此要验证是不是以“/”开头java
表单验证 (Validator) 的本质上是一个function,感受跟pipe 思路相似typescript
html:服务器
<form nz-form [formGroup]="configForm" (ngSubmit)="submitConfig()" (ngReset)="resetConfig()"> <div nz-form-item nz-row> <div nz-form-label nz-col [nzSpan]="6"> <label nz-form-item-required>数据存储目录</label> </div> <div nz-form-control nz-col [nzSpan]="12" nzHasFeedback> <nz-input formControlName="NODE_PATH" [nzPlaceHolder]="'存储路径'" [nzSize]="'large'"> <ng-template #addOnBefore>{{ filePathPrefix }}</ng-template> </nz-input> <div nz-form-explain *ngIf="validateCorrect('NODE_PATH')"> 只支持一个目录,好比:/home/temp/data </div> <div nz-form-explain *ngIf="validateError('NODE_PATH')"> 存储目录不可为空 </div> <div nz-form-explain *ngIf="getFormControl('NODE_PATH').hasError('invalidPath')"> 绝对路径必需要以“/”开头 </div> </div> </div> </form>
typescript:异步
export class ConfigComponent implements OnInit { configForm : FormGroup; filePathPrefix = 'file://'; constructor(private fb: FormBuilder) { } ngOnInit() { this.configForm = this.fb.group({ NODE_PATH: [null, Validators.required, ConfigComponent.validateFilePath] }); } static validateFilePath(control: FormControl) { let filePath = control.value; return Observable.of(filePath && filePath.startsWith('/')).map(result => { return !!result ? null : { invalidPath: true }; }); } /** * 提交配置信息 */ submitConfig() { } /** * 从新配置信息 */ resetConfig() { } getFormControl(name) { return this.configForm.controls[name]; } }
validators 必需要返回一个Observable 对象,由于是异步验证ui
当用户输入是以“/”开头时,返回null,表示验证经过this
当用户输入没有以“/”开头时,返回一个对象,表示验证失败,返回对象能够自定义,好比这里就返回了一个对象 { invalidPath: true } ,这样的话就能够在html 里使用hasError('invalidPath') 来取值了spa
这样写其实html 冗余代码比较多,能够把各类提示信息再封装一下,让html 更加简洁,可读性更强code