1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
import {AfterViewInit, Directive, ElementRef, forwardRef, Input} from '@angular/core';
import {AbstractControl, NG_VALIDATORS, ValidatorFn, Validators} from '@angular/forms';
import {NumberWrapperParseFloat} from '../core/number-wrapper-parse';
@Directive({
selector: '[max][ngModel],[max][formControl],[max][formControlName]',
providers: [{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => MaxValidatorDirective),
multi: true
}],
})
export class MaxValidatorDirective implements AfterViewInit {
private _validator: ValidatorFn;
private inputElement: any;
constructor(elementRef: ElementRef) {
this.inputElement = elementRef;
}
ngAfterViewInit() {
this.inputElement = this.inputElement.nativeElement.querySelector('input');
if (this.inputElement && this.inputElement.querySelector('input')) {
this._validator = max(NumberWrapperParseFloat(
this.inputElement.querySelector('input').getAttribute('max')));
}
}
@Input()
set max(maxValue: string) {
this._validator = max(NumberWrapperParseFloat(maxValue));
}
validate(c: AbstractControl): {[key: string]: any} {
return this._validator(c);
}
}
function max(maxvalue: number): ValidatorFn {
return (control: AbstractControl): {[key: string]: any} => {
if (Validators.required(control) !== undefined &&
Validators.required(control) !== null) {
return null;
}
let v: Number = Number(control.value);
return v > maxvalue ?
{'max': {'requiredValue': maxvalue, 'actualValue': v}} :
null;
};
}
|