本周写的项目须要对名称进行验重,采用的是angular的异步验证器的方式.java
首先要查询数据库表中是否存在相同名称,须要一个验证重复的后台接口:数据库
/** * @description 是否存在姓名 * @param name 姓名 * @return java.lang.Boolean * @author htx * @date 下午7:19 19-3-28 **/ @GetMapping("existByName/{name}") public Boolean existByName(@PathVariable String name) { return majorService.existsByName(name); }
只须要查询数据库中是否存在该名称,返回true或false便可.app
由于在编辑和添加时都须要验证,因而就把获取验证方法写在了服务里,从服务里获取验证方法:异步
/** * @description 获取名称是否重复的验证器 * @param name 当name存在时 默认跳过name(用于编辑可能保留原名称) * @return AsyncValidatorFn 异步验证器 * @author htx * @date 下午7:53 19-3-28 **/ getValidatorNameExistFn(): AsyncValidatorFn { return (control: AbstractControl): Observable<ValidationErrors | null> => { return this.existByName(control.value).pipe( map(exist => (exist ? {exist: true} : null)), catchError(() => null) ); }; } /** * @description 是否存在相同编号名称 * @param name 名称 * @author htx * @date 下午7:45 19-3-28 **/ existByName(name: string): Observable<boolean> { return this.http.get<boolean>(this.baseUrl + '/existByName/' + name); }
执行getValidatorNameExistFn()方法就会获取验证名字是否重复的异步验证方法,由于AsyncValidatorFn接口要求返回的是
Observable<ValidationErrors | null>,但咱们后台接口返回的是true或false,所以须要用map操做符进行转换.
在创建控件的时候将验证方法加入异步验证便可:ui
this.validateForm = this.fb.group({ name: [null, [Validators.required], [this.majorService.getValidatorNameExistFn()]], number: [null, [Validators.required], [this.majorService.getValidatorNumberExistFn()]], college: [null], teacherList: [null] });
v层中增长提示信息:this
<nz-form-explain *ngIf="validateForm.get('name').dirty && validateForm.get('name').errors?.exist">专业名称已存在! </nz-form-explain>