aboutsummaryrefslogtreecommitdiffstats
path: root/src/ngAnimate/animate.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ngAnimate/animate.js')
-rw-r--r--src/ngAnimate/animate.js40
1 files changed, 28 insertions, 12 deletions
diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js
index b1ea7d3d..99b42f38 100644
--- a/src/ngAnimate/animate.js
+++ b/src/ngAnimate/animate.js
@@ -268,6 +268,20 @@ angular.module('ngAnimate', ['ng'])
};
}])
+ .factory('$$asyncQueueBuffer', ['$timeout', function($timeout) {
+ var timer, queue = [];
+ return function(fn) {
+ $timeout.cancel(timer);
+ queue.push(fn);
+ timer = $timeout(function() {
+ for(var i = 0; i < queue.length; i++) {
+ queue[i]();
+ }
+ queue = [];
+ }, 0, false);
+ };
+ }])
+
.config(['$provide', '$animateProvider', function($provide, $animateProvider) {
var noop = angular.noop;
var forEach = angular.forEach;
@@ -291,9 +305,10 @@ angular.module('ngAnimate', ['ng'])
return extractElementNode(elm1) == extractElementNode(elm2);
}
- $provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$timeout', '$rootScope', '$document',
- function($delegate, $injector, $sniffer, $rootElement, $timeout, $rootScope, $document) {
+ $provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$$asyncQueueBuffer', '$rootScope', '$document',
+ function($delegate, $injector, $sniffer, $rootElement, $$asyncQueueBuffer, $rootScope, $document) {
+ var globalAnimationCounter = 0;
$rootElement.data(NG_ANIMATE_STATE, rootAnimateState);
// disable animations during bootstrap, but once we bootstrapped, wait again
@@ -315,10 +330,6 @@ angular.module('ngAnimate', ['ng'])
return classNameFilter.test(className);
};
- function async(fn) {
- return $timeout(fn, 0, false);
- }
-
function lookup(name) {
if (name) {
var matches = [],
@@ -685,7 +696,6 @@ angular.module('ngAnimate', ['ng'])
if(ngAnimateState.running) {
//if an animation is currently running on the element then lets take the steps
//to cancel that animation and fire any required callbacks
- $timeout.cancel(ngAnimateState.closeAnimationTimeout);
cleanup(element);
cancelAnimations(ngAnimateState.animations);
@@ -736,12 +746,15 @@ angular.module('ngAnimate', ['ng'])
//parent animations to find and cancel child animations when needed
element.addClass(NG_ANIMATE_CLASS_NAME);
+ var localAnimationCount = globalAnimationCounter++;
+
element.data(NG_ANIMATE_STATE, {
running:true,
event:animationEvent,
className:className,
structural:!isClassBased,
animations:animations,
+ index:localAnimationCount,
done:onBeforeAnimationsComplete
});
@@ -816,19 +829,19 @@ angular.module('ngAnimate', ['ng'])
}
function fireBeforeCallbackAsync() {
- async(function() {
+ $$asyncQueueBuffer(function() {
fireDOMCallback('before');
});
}
function fireAfterCallbackAsync() {
- async(function() {
+ $$asyncQueueBuffer(function() {
fireDOMCallback('after');
});
}
function fireDoneCallbackAsync() {
- async(function() {
+ $$asyncQueueBuffer(function() {
fireDOMCallback('close');
doneCallback && doneCallback();
});
@@ -855,8 +868,11 @@ angular.module('ngAnimate', ['ng'])
if(isClassBased) {
cleanup(element);
} else {
- data.closeAnimationTimeout = async(function() {
- cleanup(element);
+ $$asyncQueueBuffer(function() {
+ var data = element.data(NG_ANIMATE_STATE) || {};
+ if(localAnimationCount == data.index) {
+ cleanup(element);
+ }
});
element.data(NG_ANIMATE_STATE, data);
}