1
1
part of angular.directive;
2
2
3
- /**
4
- * _NgModelValidator refers to the required super-class which is used when creating
5
- * validation services that are used with [ngModel] . It is expected that any child-classes
6
- * that inherit from this perform the necessary logic to return a simple true/false response
7
- * when validating the contents of the model data.
8
- */
9
- abstract class _NgModelValidator {
10
- final dom.Element inputElement;
11
- final NgModel ngModel;
12
- final Scope scope;
13
- bool _listening = false ;
14
-
15
- _NgModelValidator (this .inputElement, this .ngModel, this .scope);
16
-
17
- /**
18
- * Registers the validator with to attached model.
19
- */
20
- void listen () {
21
- if (! _listening) {
22
- _listening = true ;
23
- this .ngModel.addValidator (this );
24
- }
25
- }
26
-
27
- get value => ngModel.viewValue;
28
-
29
- /**
30
- * De-registers the validator with to attached model.
31
- */
32
- void unlisten () {
33
- if (_listening) {
34
- _listening = false ;
35
- this .ngModel.removeValidator (this );
36
- }
37
- }
38
-
39
- /**
40
- * Returns true/false depending on the status of the validator's validation mechanism
41
- */
42
- bool isValid ();
3
+ abstract class NgValidatable {
4
+ String get name;
5
+ bool isValid (value);
43
6
}
44
7
45
8
/**
46
9
* Validates the model depending if required or ng-required is present on the element.
47
10
*/
48
- @NgDirective (selector: '[ng-model][required]' )
11
+ @NgDirective (
12
+ selector: '[ng-model][required]' )
49
13
@NgDirective (
50
14
selector: '[ng-model][ng-required]' ,
51
15
map: const {'ng-required' : '=>required' })
52
- class NgModelRequiredValidator extends _NgModelValidator {
53
- bool _required;
54
- get name => 'required' ;
55
-
56
- NgModelRequiredValidator (dom.Element inputElement, NgModel ngModel,
57
- Scope scope, NodeAttrs attrs):
58
- super (inputElement, ngModel, scope) {
59
- if (attrs['required' ] != null ) required = true ;
60
- }
16
+ class NgModelRequiredValidator implements NgValidatable {
17
+ bool _required = true ;
18
+
19
+ String get name => 'required' ;
20
+
21
+ NgModelRequiredValidator (NgModel ngModel) {
22
+ ngModel.addValidator (this );
23
+ }
61
24
62
- bool isValid () {
25
+ bool isValid (value ) {
63
26
// Any element which isn't required is always valid.
64
- if (! required ) return true ;
27
+ if (! _required ) return true ;
65
28
// Null is not a value, therefore not valid.
66
29
if (value == null ) return false ;
67
30
// Empty lists and/or strings are not valid.
@@ -70,70 +33,60 @@ class NgModelRequiredValidator extends _NgModelValidator {
70
33
return ! ((value is List || value is String ) && value.isEmpty);
71
34
}
72
35
73
- @NgAttr ('required' )
74
- get required => _required;
75
36
set required (value) {
76
- if (value is String ) return ;
77
- if ((_required = value) == true ) {
78
- listen ();
79
- } else {
80
- unlisten ();
81
- }
37
+ _required = value == null ? false : value;
82
38
}
83
39
}
84
40
85
41
/**
86
42
* Validates the model to see if its contents match a valid URL pattern.
87
43
*/
88
44
@NgDirective (selector: 'input[type=url][ng-model]' )
89
- class NgModelUrlValidator extends _NgModelValidator {
45
+ class NgModelUrlValidator implements NgValidatable {
90
46
static final URL_REGEXP = new RegExp (
91
47
r'^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?' +
92
48
r'(\/|\/([\w#!:.?+=&%@!\-\/]))?$' );
93
49
94
- get name => 'url' ;
50
+ String get name => 'url' ;
95
51
96
- NgModelUrlValidator (dom.Element inputElement, NgModel ngModel, Scope scope):
97
- super (inputElement, ngModel, scope) {
98
- listen ();
99
- }
52
+ NgModelUrlValidator (NgModel ngModel) {
53
+ ngModel.addValidator (this );
54
+ }
100
55
101
- bool isValid () =>
56
+ bool isValid (value ) =>
102
57
value == null || value.isEmpty || URL_REGEXP .hasMatch (value);
103
58
}
104
59
105
60
/**
106
61
* Validates the model to see if its contents match a valid email pattern.
107
62
*/
108
63
@NgDirective (selector: 'input[type=email][ng-model]' )
109
- class NgModelEmailValidator extends _NgModelValidator {
64
+ class NgModelEmailValidator implements NgValidatable {
110
65
static final EMAIL_REGEXP = new RegExp (
111
66
r'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$' );
112
67
113
- get name => 'email' ;
68
+ String get name => 'email' ;
114
69
115
- NgModelEmailValidator (dom.Element inputElement, NgModel ngModel, Scope scope):
116
- super (inputElement, ngModel, scope) {
117
- listen ();
118
- }
70
+ NgModelEmailValidator (NgModel ngModel) {
71
+ ngModel.addValidator (this );
72
+ }
119
73
120
- bool isValid () =>
74
+ bool isValid (value ) =>
121
75
value == null || value.isEmpty || EMAIL_REGEXP .hasMatch (value);
122
76
}
123
77
124
78
/**
125
79
* Validates the model to see if its contents match a valid number.
126
80
*/
127
81
@NgDirective (selector: 'input[type=number][ng-model]' )
128
- class NgModelNumberValidator extends _NgModelValidator {
129
- get name => 'number' ;
82
+ class NgModelNumberValidator implements NgValidatable {
83
+ String get name => 'number' ;
130
84
131
- NgModelNumberValidator (dom.Element inputElement, NgModel ngModel, Scope scope):
132
- super (inputElement, ngModel, scope) {
133
- listen ();
134
- }
85
+ NgModelNumberValidator (NgModel ngModel) {
86
+ ngModel.addValidator (this );
87
+ }
135
88
136
- bool isValid () {
89
+ bool isValid (value ) {
137
90
if (value != null ) {
138
91
try {
139
92
num val = double .parse (value.toString ());
@@ -153,36 +106,24 @@ class NgModelNumberValidator extends _NgModelValidator {
153
106
@NgDirective (
154
107
selector: '[ng-model][ng-pattern]' ,
155
108
map: const {'ng-pattern' : '=>pattern' })
156
- class NgModelPatternValidator extends _NgModelValidator {
109
+ class NgModelPatternValidator implements NgValidatable {
157
110
RegExp _pattern;
158
111
159
- get name => 'pattern' ;
160
-
161
- NgModelPatternValidator (dom.Element inputElement, NgModel ngModel, Scope scope):
162
- super (inputElement, ngModel, scope) {
163
- listen ();
164
- }
112
+ String get name => 'pattern' ;
165
113
166
- bool isValid () {
167
- if (_pattern != null && value != null && value.length > 0 ) {
168
- return _pattern.hasMatch (ngModel.viewValue);
169
- }
114
+ NgModelPatternValidator (NgModel ngModel) {
115
+ ngModel.addValidator (this );
116
+ }
170
117
118
+ bool isValid (value) {
171
119
//remember, only required validates for the input being empty
172
- return true ;
120
+ return _pattern == null || value == null || value.length == 0 ||
121
+ _pattern.hasMatch (value);
173
122
}
174
123
175
124
@NgAttr ('pattern' )
176
- get pattern => _pattern;
177
- set pattern (val) {
178
- if (val != null && val.length > 0 ) {
179
- _pattern = new RegExp (val);
180
- listen ();
181
- } else {
182
- _pattern = null ;
183
- unlisten ();
184
- }
185
- }
125
+ set pattern (val) =>
126
+ _pattern = val != null && val.length > 0 ? new RegExp (val) : null ;
186
127
}
187
128
188
129
/**
@@ -194,29 +135,24 @@ class NgModelPatternValidator extends _NgModelValidator {
194
135
@NgDirective (
195
136
selector: '[ng-model][ng-minlength]' ,
196
137
map: const {'ng-minlength' : '=>minlength' })
197
- class NgModelMinLengthValidator extends _NgModelValidator {
138
+ class NgModelMinLengthValidator implements NgValidatable {
198
139
int _minlength;
199
140
200
- get name => 'minlength' ;
141
+ String get name => 'minlength' ;
201
142
202
- NgModelMinLengthValidator (dom.Element inputElement, NgModel ngModel,
203
- Scope scope) : super (inputElement, ngModel, scope) {
204
- listen ();
205
- }
143
+ NgModelMinLengthValidator (NgModel ngModel) {
144
+ ngModel.addValidator (this );
145
+ }
206
146
207
- bool isValid () {
147
+ bool isValid (value ) {
208
148
//remember, only required validates for the input being empty
209
- if (_minlength == 0 || value == null || value.length == 0 ) {
210
- return true ;
211
- }
212
- return value.length >= _minlength;
149
+ return _minlength == 0 || value == null || value.length == 0 ||
150
+ value.length >= _minlength;
213
151
}
214
152
215
153
@NgAttr ('minlength' )
216
- get minlength => _minlength;
217
- set minlength (value) {
218
- _minlength = value == null ? 0 : int .parse (value.toString ());
219
- }
154
+ set minlength (value) =>
155
+ _minlength = value == null ? 0 : int .parse (value.toString ());
220
156
}
221
157
222
158
/**
@@ -228,22 +164,19 @@ class NgModelMinLengthValidator extends _NgModelValidator {
228
164
@NgDirective (
229
165
selector: '[ng-model][ng-maxlength]' ,
230
166
map: const {'ng-maxlength' : '=>maxlength' })
231
- class NgModelMaxLengthValidator extends _NgModelValidator {
167
+ class NgModelMaxLengthValidator implements NgValidatable {
232
168
int _maxlength = 0 ;
233
169
234
- get name => 'maxlength' ;
170
+ String get name => 'maxlength' ;
235
171
236
- NgModelMaxLengthValidator (dom.Element inputElement, NgModel ngModel,
237
- Scope scope): super (inputElement, ngModel, scope) {
238
- listen ();
239
- }
172
+ NgModelMaxLengthValidator (NgModel ngModel) {
173
+ ngModel.addValidator (this );
174
+ }
240
175
241
- bool isValid () =>
176
+ bool isValid (value ) =>
242
177
_maxlength == 0 || (value == null ? 0 : value.length) <= _maxlength;
243
178
244
179
@NgAttr ('maxlength' )
245
- get maxlength => _maxlength;
246
- set maxlength (value) {
247
- _maxlength = value == null ? 0 : int .parse (value.toString ());
248
- }
180
+ set maxlength (value) =>
181
+ _maxlength = value == null ? 0 : int .parse (value.toString ());
249
182
}
0 commit comments