Permalink
Browse files
fix($animateCss): only (de)register listeners when events have been a…
…dded
Previously, when an animation was closed because no animation styles
where found, it would call .off() with an empty string as the argument.
For both jquery/jqlite this is the same as calling .off() without any
argument, which deregisters all event listeners on an element.
Closes #13514
Loading branch information
Showing
2 changed files
with
39 additions
and
3 deletions .
+6
−3
src/ngAnimate/animateCss.js
+33
−0
test/ngAnimate/animateCssSpec.js
@@ -749,8 +749,8 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
options . onDone ( ) ;
}
// Remove the transitionend / animationend listener(s)
if ( events ) {
if ( events && events . length ) {
// Remove the transitionend / animationend listener(s)
element . off ( events . join ( ' ' ) , onAnimationProgress ) ;
}
@@ -960,7 +960,10 @@ var $AnimateCssProvider = ['$animateProvider', function($animateProvider) {
element . data ( ANIMATE_TIMER_KEY , animationsData ) ;
}
element . on ( events . join ( ' ' ) , onAnimationProgress ) ;
if ( events . length ) {
element . on ( events . join ( ' ' ) , onAnimationProgress ) ;
}
if ( options . to ) {
if ( options . cleanupStyles ) {
registerRestorableStyles ( restoreStyles , node , Object . keys ( options . to ) ) ;
@@ -1502,6 +1502,39 @@ describe("ngAnimate $animateCss", function() {
expect ( elementOffSpy . mostRecentCall . args [ 0 ] ) . toBe ( event ) ;
} ) ;
} ) ;
they ( "should not add or remove $prop event listeners when no animation styles are detected" ,
[ TRANSITIONEND_EVENT , ANIMATIONEND_EVENT ] , function ( event ) {
inject ( function ( $animateCss , $timeout ) {
progress = event === TRANSITIONEND_EVENT ? transitionProgress : keyframeProgress ;
// Make sure other event listeners are not affected
var otherEndSpy = jasmine . createSpy ( 'otherEndSpy' ) ;
element . on ( event , otherEndSpy ) ;
expect ( elementOnSpy ) . toHaveBeenCalledOnce ( ) ;
elementOnSpy . reset ( ) ;
var animator = $animateCss ( element , {
event : 'enter' ,
structural : true
} ) ;
expect ( animator . $$willAnimate ) . toBeFalsy ( ) ;
// This will close the animation because no styles have been detected
var runner = animator . start ( ) ;
triggerAnimationStartFrame ( ) ;
expect ( elementOnSpy ) . not . toHaveBeenCalled ( ) ;
expect ( elementOffSpy ) . not . toHaveBeenCalled ( ) ;
progress ( element , 10 ) ;
expect ( otherEndSpy ) . toHaveBeenCalledOnce ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
Toggle all file notes