refactor($animate): queue all successive animations to use only one reflow

This commit is contained in:
Matias Niemelä
2013-10-07 14:35:24 -04:00
committed by Misko Hevery
parent 3f31a7c769
commit 23c698821f
2 changed files with 98 additions and 20 deletions

View File

@@ -569,7 +569,7 @@ angular.module('ngAnimate', ['ng'])
}
}]);
$animateProvider.register('', ['$window', '$sniffer', function($window, $sniffer) {
$animateProvider.register('', ['$window', '$sniffer', '$timeout', function($window, $sniffer, $timeout) {
var forEach = angular.forEach;
// Detect proper transitionend/animationend event names.
@@ -605,6 +605,19 @@ angular.module('ngAnimate', ['ng'])
animationIterationCountKey = 'IterationCount',
ELEMENT_NODE = 1;
var animationReflowQueue = [], animationTimer, timeOut = false;
function afterReflow(callback) {
animationReflowQueue.push(callback);
$timeout.cancel(animationTimer);
animationTimer = $timeout(function() {
angular.forEach(animationReflowQueue, function(fn) {
fn();
});
animationReflowQueue = [];
animationTimer = null;
}, 10, false);
}
function animate(element, className, done) {
if(['ng-enter','ng-leave','ng-move'].indexOf(className) == -1) {
var existingDuration = 0;
@@ -670,13 +683,15 @@ angular.module('ngAnimate', ['ng'])
});
// This triggers a reflow which allows for the transition animation to kick in.
element.prop('clientWidth');
if(transitionDuration > 0) {
node.style[transitionProp + propertyKey] = '';
}
element.addClass(activeClassName);
var css3AnimationEvents = animationendEvent + ' ' + transitionendEvent;
afterReflow(function() {
if(transitionDuration > 0) {
node.style[transitionProp + propertyKey] = '';
}
element.addClass(activeClassName);
});
element.on(css3AnimationEvents, onAnimationProgress);
// This will automatically be called by $animate so