tycg_carviolation_FE/src/app/directives/equal-validator/equal-validator.directive.ts
2023-08-03 10:37:39 +08:00

59 lines
1.5 KiB
TypeScript

import { Directive, forwardRef, Attribute } from "@angular/core";
import { Validator, AbstractControl, NG_VALIDATORS } from "@angular/forms";
@Directive({
selector:
// tslint:disable-next-line:directive-selector
"[validateEqual][formControlName],[validateEqual][formControl],[validateEqual][ngModel]",
providers: [
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => EqualValidator),
multi: true
}
]
})
export class EqualValidator implements Validator {
constructor(
@Attribute("validateEqual") public validateEqual: string,
@Attribute("reverse") public reverse: string
) {}
private get isReverse() {
// tslint:disable-next-line:curly
if (!this.reverse) return false;
return this.reverse === "true" ? true : false;
}
validate(c: AbstractControl): { [key: string]: any } {
// self value
// tslint:disable-next-line:prefer-const
let v = c.value;
// control vlaue
// tslint:disable-next-line:prefer-const
let e = c.root.get(this.validateEqual);
// value not equal
if (e && v !== e.value && !this.isReverse) {
return {
validateEqual: false
};
}
// value equal and reverse
if (e && v === e.value && this.isReverse) {
delete e.errors["validateEqual"];
// tslint:disable-next-line:curly
if (!Object.keys(e.errors).length) e.setErrors(null);
}
// value not equal and reverse
if (e && v !== e.value && this.isReverse) {
e.setErrors({ validateEqual: false });
}
return null;
}
}