diff options
| -rw-r--r-- | src/ngAnimate/animate.js | 26 | ||||
| -rw-r--r-- | test/ngAnimate/animateSpec.js | 33 |
2 files changed, 54 insertions, 5 deletions
diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index ab7c5816..1956d54c 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -1001,7 +1001,7 @@ angular.module('ngAnimate', ['ng']) if(timings.transitionDuration > 0) { element.addClass(NG_ANIMATE_FALLBACK_CLASS_NAME); activeClassName += NG_ANIMATE_FALLBACK_ACTIVE_CLASS_NAME + ' '; - node.style[TRANSITION_PROP + PROPERTY_KEY] = 'none'; + blockTransitions(element); } forEach(className.split(' '), function(klass, i) { @@ -1021,6 +1021,17 @@ angular.module('ngAnimate', ['ng']) return true; } + function blockTransitions(element) { + element[0].style[TRANSITION_PROP + PROPERTY_KEY] = 'none'; + } + + function unblockTransitions(element) { + var node = element[0], prop = TRANSITION_PROP + PROPERTY_KEY; + if(node.style[prop] && node.style[prop].length > 0) { + node.style[prop] = ''; + } + } + function animateRun(element, className, activeAnimationComplete) { var data = element.data(NG_ANIMATE_CSS_DATA_KEY); if(!element.hasClass(className) || !data) { @@ -1041,8 +1052,6 @@ angular.module('ngAnimate', ['ng']) var applyFallbackStyle, style = ''; if(timings.transitionDuration > 0) { - node.style[TRANSITION_PROP + PROPERTY_KEY] = ''; - var propertyStyle = timings.transitionPropertyStyle; if(propertyStyle.indexOf('all') == -1) { applyFallbackStyle = true; @@ -1150,6 +1159,7 @@ angular.module('ngAnimate', ['ng']) //happen in the first place var cancel = preReflowCancellation; afterReflow(function() { + unblockTransitions(element); //once the reflow is complete then we point cancel to //the new cancellation function which will remove all of the //animation properties from the active animation @@ -1213,7 +1223,10 @@ angular.module('ngAnimate', ['ng']) beforeAddClass : function(element, className, animationCompleted) { var cancellationMethod = animateBefore(element, suffixClasses(className, '-add')); if(cancellationMethod) { - afterReflow(animationCompleted); + afterReflow(function() { + unblockTransitions(element); + animationCompleted(); + }); return cancellationMethod; } animationCompleted(); @@ -1226,7 +1239,10 @@ angular.module('ngAnimate', ['ng']) beforeRemoveClass : function(element, className, animationCompleted) { var cancellationMethod = animateBefore(element, suffixClasses(className, '-remove')); if(cancellationMethod) { - afterReflow(animationCompleted); + afterReflow(function() { + unblockTransitions(element); + animationCompleted(); + }); return cancellationMethod; } animationCompleted(); diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index b9b7f9ed..2362576a 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -2663,4 +2663,37 @@ describe("ngAnimate", function() { expect(element.hasClass('base-class')).toBe(true); })); + it('should block and unblock transitions before the dom operation occurs', + inject(function($rootScope, $compile, $rootElement, $document, $animate, $sniffer, $timeout) { + + if (!$sniffer.transitions) return; + + $animate.enabled(true); + + ss.addRule('.cross-animation', '-webkit-transition:1s linear all;' + + 'transition:1s linear all;'); + + var capturedProperty = 'none'; + + var element = $compile('<div class="cross-animation"></div>')($rootScope); + $rootElement.append(element); + jqLite($document[0].body).append($rootElement); + + var node = element[0]; + node._setAttribute = node.setAttribute; + node.setAttribute = function(prop, val) { + if(prop == 'class' && val.indexOf('trigger-class') >= 0) { + var propertyKey = ($sniffer.vendorPrefix == 'Webkit' ? '-webkit-' : '') + 'transition-property'; + capturedProperty = element.css(propertyKey); + } + node._setAttribute(prop, val); + }; + + $animate.addClass(element, 'trigger-class'); + + $timeout.flush(); + + expect(capturedProperty).not.toBe('none'); + })); + }); |
