diff --git a/src/ngAnimate/shared.js b/src/ngAnimate/shared.js index 54d3c95412ae..259895f5b549 100644 --- a/src/ngAnimate/shared.js +++ b/src/ngAnimate/shared.js @@ -285,10 +285,10 @@ function resolveElementClasses(existing, toAdd, toRemove) { var prop, allow; if (val === ADD_CLASS) { prop = 'addClass'; - allow = !existing[klass]; + allow = !existing[klass] || existing[klass + REMOVE_CLASS_SUFFIX]; } else if (val === REMOVE_CLASS) { prop = 'removeClass'; - allow = existing[klass]; + allow = existing[klass] || existing[klass + ADD_CLASS_SUFFIX]; } if (allow) { if (classes[prop].length) { diff --git a/test/ngAnimate/integrationSpec.js b/test/ngAnimate/integrationSpec.js index 25553298f1bb..a84c3eb88a2a 100644 --- a/test/ngAnimate/integrationSpec.js +++ b/test/ngAnimate/integrationSpec.js @@ -51,6 +51,51 @@ describe('ngAnimate integration tests', function() { expect(doneHandler).toHaveBeenCalled(); })); + it('should remove a class that is currently being added by a running animation when another class is added in before in the same digest', + inject(function($animate, $rootScope, $$rAF, $document, $rootElement) { + + jqLite($document[0].body).append($rootElement); + element = jqLite('
'); + $rootElement.append(element); + + var runner = $animate.addClass(element, 'red'); + + $rootScope.$digest(); + + $animate.addClass(element, 'blue'); + $animate.removeClass(element, 'red'); + $rootScope.$digest(); + + $$rAF.flush(); + + expect(element).not.toHaveClass('red'); + expect(element).toHaveClass('blue'); + })); + + + it('should add a class that is currently being removed by a running animation when another class is removed before in the same digest', + inject(function($animate, $rootScope, $$rAF, $document, $rootElement) { + + jqLite($document[0].body).append($rootElement); + element = jqLite('
'); + $rootElement.append(element); + element.addClass('red blue'); + + var runner = $animate.removeClass(element, 'red'); + + $rootScope.$digest(); + + $animate.removeClass(element, 'blue'); + $animate.addClass(element, 'red'); + $rootScope.$digest(); + + $$rAF.flush(); + + expect(element).not.toHaveClass('blue'); + expect(element).toHaveClass('red'); + })); + + describe('CSS animations', function() { if (!browserSupportsCssAnimations()) return;