1
- import { StringWrapper , isPresent } from 'angular2/src/facade/lang' ;
1
+ import { StringWrapper , isPresent , isBlank } from 'angular2/src/facade/lang' ;
2
2
import { Observable , EventEmitter , ObservableWrapper } from 'angular2/src/facade/async' ;
3
3
import { StringMap , StringMapWrapper , ListWrapper , List } from 'angular2/src/facade/collection' ;
4
4
import { Validators } from './validators' ;
@@ -21,6 +21,24 @@ export function isControl(c: Object): boolean {
21
21
return c instanceof AbstractControl ;
22
22
}
23
23
24
+ function _find ( c : AbstractControl , path : List < string | number > | string ) {
25
+ if ( isBlank ( path ) ) return null ;
26
+ if ( ! ( path instanceof List ) ) {
27
+ path = StringWrapper . split ( < string > path , new RegExp ( "/" ) ) ;
28
+ }
29
+ if ( ListWrapper . isEmpty ( path ) ) return null ;
30
+
31
+ return ListWrapper . reduce ( < List < string | number > > path , ( v , name ) => {
32
+ if ( v instanceof ControlGroup ) {
33
+ return isPresent ( v . controls [ name ] ) ? v . controls [ name ] : null ;
34
+ } else if ( v instanceof ControlArray ) {
35
+ var index = < number > name ;
36
+ return isPresent ( v . at ( index ) ) ? v . at ( index ) : null ;
37
+ } else {
38
+ return null ;
39
+ }
40
+ } , c ) ;
41
+ }
24
42
25
43
/**
26
44
* Omitting from external API doc as this is really an abstract internal concept.
@@ -31,7 +49,7 @@ export class AbstractControl {
31
49
_errors : StringMap < string , any > ;
32
50
_pristine : boolean ;
33
51
_touched : boolean ;
34
- _parent : any ; /* ControlGroup | ControlArray */
52
+ _parent : ControlGroup | ControlArray ;
35
53
validator : Function ;
36
54
37
55
_valueChanges : EventEmitter ;
@@ -78,6 +96,7 @@ export class AbstractControl {
78
96
79
97
this . _errors = this . validator ( this ) ;
80
98
this . _status = isPresent ( this . _errors ) ? INVALID : VALID ;
99
+
81
100
if ( isPresent ( this . _parent ) && ! onlySelf ) {
82
101
this . _parent . updateValidity ( { onlySelf : onlySelf } ) ;
83
102
}
@@ -101,6 +120,21 @@ export class AbstractControl {
101
120
}
102
121
}
103
122
123
+ find ( path : List < string | number > | string ) : AbstractControl { return _find ( this , path ) ; }
124
+
125
+ getError ( errorCode : string , path : List < string > = null ) {
126
+ var c = this . find ( path ) ;
127
+ if ( isPresent ( c ) && isPresent ( c . _errors ) ) {
128
+ return StringMapWrapper . get ( c . _errors , errorCode ) ;
129
+ } else {
130
+ return null ;
131
+ }
132
+ }
133
+
134
+ hasError ( errorCode : string , path : List < string > = null ) {
135
+ return isPresent ( this . getError ( errorCode , path ) ) ;
136
+ }
137
+
104
138
_updateValue ( ) : void { }
105
139
}
106
140
@@ -168,7 +202,10 @@ export class ControlGroup extends AbstractControl {
168
202
this . updateValidity ( { onlySelf : true } ) ;
169
203
}
170
204
171
- addControl ( name : string , c : AbstractControl ) { this . controls [ name ] = c ; }
205
+ addControl ( name : string , c : AbstractControl ) {
206
+ this . controls [ name ] = c ;
207
+ c . setParent ( this ) ;
208
+ }
172
209
173
210
removeControl ( name : string ) { StringMapWrapper . delete ( this . controls , name ) ; }
174
211
@@ -187,18 +224,6 @@ export class ControlGroup extends AbstractControl {
187
224
return c && this . _included ( controlName ) ;
188
225
}
189
226
190
- find ( path : string | List < string > ) : AbstractControl {
191
- if ( ! ( path instanceof List ) ) {
192
- path = StringWrapper . split ( < string > path , new RegExp ( "/" ) ) ;
193
- }
194
-
195
- return ListWrapper . reduce (
196
- < List < string > > path , ( v , name ) => v instanceof ControlGroup && isPresent ( v . controls [ name ] ) ?
197
- v . controls [ name ] :
198
- null ,
199
- this ) ;
200
- }
201
-
202
227
_setParentForControls ( ) {
203
228
StringMapWrapper . forEach ( this . controls , ( control , name ) => { control . setParent ( this ) ; } ) ;
204
229
}
0 commit comments