@@ -176,6 +176,11 @@ module Validation {
176
176
*/
177
177
Optional ?: IOptional ;
178
178
179
+ /**
180
+ * Occurs when the validation errors have changed for a property or for the entire entity.
181
+ */
182
+ ErrorsChanged :Utils . ISignal < any > ;
183
+
179
184
/**
180
185
* It enables support for localization of error messages.
181
186
*/
@@ -361,7 +366,7 @@ module Validation {
361
366
/**
362
367
* It represents property validation rule for type of <T>.
363
368
*/
364
- export interface IPropertyValidationRule < T > {
369
+ export interface IPropertyValidationRule < T > extends IValidationResult {
365
370
/**
366
371
*The validators that are grouped under this rule.
367
372
*/
@@ -435,7 +440,7 @@ module Validation {
435
440
*/
436
441
export class Error implements IError {
437
442
438
- public HasError : boolean = true ;
443
+ public HasError : boolean = false ;
439
444
public ErrorMessage : string = "" ;
440
445
441
446
constructor ( ) {
@@ -493,6 +498,11 @@ module Validation {
493
498
public Remove ( index : number ) {
494
499
throw ( "Cannot remove ValidationResult from leaf node." ) ;
495
500
}
501
+ public ErrorsChanged :Utils . ISignal < any > = new Utils . Signal ( ) ;
502
+
503
+ public DispatchErrorsChanged ( ) {
504
+ if ( this . ErrorsChanged !== undefined ) this . ErrorsChanged . dispatch ( this ) ;
505
+ }
496
506
497
507
public Optional : IOptional ;
498
508
public TranslateArgs :Array < IErrorTranslateArgs > ;
@@ -511,11 +521,8 @@ module Validation {
511
521
public get ErrorMessage ( ) : string {
512
522
return "" ;
513
523
}
514
-
515
-
516
524
}
517
525
518
-
519
526
/**
520
527
*
521
528
* @ngdoc object
@@ -535,6 +542,7 @@ module Validation {
535
542
536
543
public Optional : IOptional ;
537
544
545
+ public ErrorsChanged :Utils . ISignal < any > = new Utils . Signal ( ) ;
538
546
539
547
public AddFirst ( error : IValidationResult ) {
540
548
this . Children . unshift ( error ) ;
@@ -784,6 +792,8 @@ module Validation {
784
792
*/
785
793
class AbstractValidationRule < T > implements IAbstractValidationRule < T > {
786
794
public get ValidationResult ( ) :IValidationResult { return this . ValidationResultVisitor . ValidationResult ; }
795
+ public set ValidationResult ( value :IValidationResult ) { this . ValidationResultVisitor . ValidationResult = value ; }
796
+
787
797
public Rules :{ [ name : string ] : IPropertyValidationRule < T > ; } = { } ;
788
798
public Validators : { [ name : string ] : IValidator ; } = { } ;
789
799
public Children :{ [ name : string ] : IAbstractValidationRule < any > ; } = { } ;
@@ -838,9 +848,9 @@ module Validation {
838
848
public SetOptional ( fce :IOptional ) {
839
849
840
850
this . ValidationResult . Optional = fce ;
841
- // _.each(this.Rules, function(value:IValidationResult, key:string){value.Optional = fce;});
842
- // _.each(this.Validators, function(value:any, key:string){value.Optional = fce;});
843
- // _.each(this.Children, function(value:any, key:string){value.SetOptional(fce);});
851
+ _ . each ( this . Rules , function ( value :IValidationResult , key :string ) { value . Optional = fce ; } ) ;
852
+ _ . each ( this . Validators , function ( value :any , key :string ) { value . Optional = fce ; } ) ;
853
+ _ . each ( this . Children , function ( value :any , key :string ) { value . SetOptional ( fce ) ; } ) ;
844
854
}
845
855
846
856
private createRuleFor ( prop :string ) {
@@ -874,6 +884,7 @@ module Validation {
874
884
} , this )
875
885
} , this ) ;
876
886
887
+
877
888
return this . ValidationResult ;
878
889
}
879
890
@@ -944,6 +955,7 @@ module Validation {
944
955
}
945
956
946
957
public AddRule ( rule :PropertyValidationRule < any > ) {
958
+ //if (this.ValidationResult.ErrorsChanged !== undefined) rule.ErrorsChanged = this.ValidationResult.ErrorsChanged;
947
959
this . ValidationResult . Add ( rule ) ;
948
960
}
949
961
@@ -1157,7 +1169,6 @@ module Validation {
1157
1169
*/
1158
1170
class PropertyValidationRule < T > extends ValidationResult implements IPropertyValidationRule < T > {
1159
1171
1160
-
1161
1172
public Validators :{ [ name :string ] : any } = { } ;
1162
1173
public ValidationFailures :{ [ name :string ] : IValidationFailure } = { } ;
1163
1174
//public AsyncValidationFailures:{[name:string]: IAsyncValidationFailure} = {};
@@ -1233,6 +1244,8 @@ module Validation {
1233
1244
var lastPriority :number = 0 ;
1234
1245
var shortCircuited :boolean = false ;
1235
1246
1247
+ var original = this . HasErrors ;
1248
+
1236
1249
for ( var index in this . ValidationFailures ) {
1237
1250
1238
1251
var validation :IValidationFailure = this . ValidationFailures [ index ] ;
@@ -1253,6 +1266,7 @@ module Validation {
1253
1266
1254
1267
shortCircuited = hasError ;
1255
1268
lastPriority = priority ;
1269
+
1256
1270
}
1257
1271
1258
1272
} catch ( e ) {
@@ -1262,6 +1276,7 @@ module Validation {
1262
1276
throw e ;
1263
1277
}
1264
1278
}
1279
+ if ( original !== this . HasErrors ) this . DispatchErrorsChanged ( ) ;
1265
1280
return _ . filter ( this . ValidationFailures , function ( item ) { return ! item . IsAsync ; } ) ;
1266
1281
}
1267
1282
@@ -1272,12 +1287,14 @@ module Validation {
1272
1287
ValidateAsync ( context :IValidationContext < T > ) :Q . Promise < Array < IValidationFailure > > {
1273
1288
return this . ValidateAsyncEx ( context . Value ) ;
1274
1289
}
1275
- /**
1290
+
1291
+ /**
1276
1292
* Performs validation using a validation context and returns a collection of Validation Failures asynchronoulsy.
1277
1293
*/
1278
1294
ValidateAsyncEx ( value :string ) :Q . Promise < Array < IValidationFailure > > {
1279
1295
var deferred = Q . defer < Array < IValidationFailure > > ( ) ;
1280
1296
var promises = [ ] ;
1297
+ var original = this . HasErrors ;
1281
1298
var setResultFce = function ( result ) {
1282
1299
var hasError = ! result ;
1283
1300
@@ -1307,7 +1324,10 @@ module Validation {
1307
1324
}
1308
1325
1309
1326
var self = this ;
1310
- Q . all ( promises ) . then ( function ( result ) { deferred . resolve ( _ . filter ( self . ValidationFailures , function ( item ) { return item . IsAsync ; } ) ) } ) ;
1327
+ Q . all ( promises ) . then ( function ( result ) {
1328
+ if ( original !== self . HasErrors ) self . DispatchErrorsChanged ( ) ;
1329
+ deferred . resolve ( _ . filter ( self . ValidationFailures , function ( item ) { return item . IsAsync ; } ) )
1330
+ } ) ;
1311
1331
return deferred . promise ;
1312
1332
1313
1333
}
@@ -1337,7 +1357,9 @@ module Validation {
1337
1357
public Optional :IOptional ;
1338
1358
1339
1359
public Validate ( context :any ) :IValidationFailure {
1360
+ var original = this . Error . HasError ;
1340
1361
if ( this . ValidateFce !== undefined ) this . ValidateFce . bind ( context ) ( this . Error ) ;
1362
+ if ( original !== this . Error . HasError ) this . DispatchErrorsChanged ( ) ;
1341
1363
return this . ValidationFailures [ this . Name ] ;
1342
1364
}
1343
1365
@@ -1348,8 +1370,10 @@ module Validation {
1348
1370
deferred . resolve ( this . ValidationFailures [ this . Name ] ) ;
1349
1371
}
1350
1372
else {
1373
+ var original = this . Error . HasError ;
1351
1374
var self = this ;
1352
1375
this . AsyncValidationFce . bind ( context ) ( this . Error ) . then ( function ( ) {
1376
+ if ( original !== self . Error . HasError ) self . DispatchErrorsChanged ( ) ;
1353
1377
deferred . resolve ( self . ValidationFailures [ self . Name ] ) ;
1354
1378
} ) ;
1355
1379
}
0 commit comments