@@ -3413,6 +3413,71 @@ describe("ngAnimate", function() {
3413
3413
} ) ;
3414
3414
} ) ;
3415
3415
3416
+ it ( 'should intelligently cancel out redundant class-based animations' , function ( ) {
3417
+ var log = [ ] ;
3418
+ var track = function ( name ) {
3419
+ return function ( ) {
3420
+ log . push ( { name : name , className : arguments [ 1 ] } ) ;
3421
+ } ;
3422
+ } ;
3423
+ module ( function ( $animateProvider ) {
3424
+ $animateProvider . register ( '.animate' , function ( ) {
3425
+ return {
3426
+ addClass : track ( 'addClass' ) ,
3427
+ removeClass : track ( 'removeClass' )
3428
+ } ;
3429
+ } ) ;
3430
+ } ) ;
3431
+ inject ( function ( $rootScope , $animate , $compile , $rootElement , $document ) {
3432
+ $animate . enabled ( true ) ;
3433
+
3434
+ var element = $compile ( '<div class="animate three four"></div>' ) ( $rootScope ) ;
3435
+ $rootElement . append ( element ) ;
3436
+ angular . element ( $document [ 0 ] . body ) . append ( $rootElement ) ;
3437
+
3438
+ $animate . removeClass ( element , 'one' ) ;
3439
+ $rootScope . $digest ( ) ;
3440
+ $animate . triggerReflow ( ) ;
3441
+ expect ( log . length ) . toBe ( 0 ) ;
3442
+ $animate . triggerCallbacks ( ) ;
3443
+
3444
+ $animate . addClass ( element , 'two' ) ;
3445
+ $animate . addClass ( element , 'two' ) ;
3446
+ $animate . removeClass ( element , 'two' ) ;
3447
+ $rootScope . $digest ( ) ;
3448
+ $animate . triggerReflow ( ) ;
3449
+ expect ( log . length ) . toBe ( 0 ) ;
3450
+ $animate . triggerCallbacks ( ) ;
3451
+
3452
+ $animate . removeClass ( element , 'three' ) ;
3453
+ $animate . addClass ( element , 'three' ) ;
3454
+ $rootScope . $digest ( ) ;
3455
+ $animate . triggerReflow ( ) ;
3456
+ expect ( log . length ) . toBe ( 0 ) ;
3457
+ $animate . triggerCallbacks ( ) ;
3458
+
3459
+ $animate . removeClass ( element , 'four' ) ;
3460
+ $animate . addClass ( element , 'four' ) ;
3461
+ $animate . removeClass ( element , 'four' ) ;
3462
+ $rootScope . $digest ( ) ;
3463
+ $animate . triggerReflow ( ) ;
3464
+ expect ( log . length ) . toBe ( 1 ) ;
3465
+ $animate . triggerCallbacks ( ) ;
3466
+ expect ( log [ 0 ] ) . toEqual ( { name : 'removeClass' , className : 'four' } ) ;
3467
+
3468
+ $animate . addClass ( element , 'five' ) ;
3469
+ $animate . addClass ( element , 'five' ) ;
3470
+ $animate . addClass ( element , 'five' ) ;
3471
+ $animate . removeClass ( element , 'five' ) ;
3472
+ $animate . addClass ( element , 'five' ) ;
3473
+ $rootScope . $digest ( ) ;
3474
+ $animate . triggerReflow ( ) ;
3475
+ expect ( log . length ) . toBe ( 2 ) ;
3476
+ $animate . triggerCallbacks ( ) ;
3477
+ expect ( log [ 1 ] ) . toEqual ( { name : 'addClass' , className : 'five' } ) ;
3478
+ } ) ;
3479
+ } ) ;
3480
+
3416
3481
it ( 'should skip class-based animations if the element is removed before the digest occurs' , function ( ) {
3417
3482
var spy = jasmine . createSpy ( ) ;
3418
3483
module ( function ( $animateProvider ) {
0 commit comments