diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index b87ed335cb2b..b5b3fb8f0b19 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -1194,18 +1194,22 @@ angular.module('ngAnimate', ['ng']) } return cache.promise = runAnimationPostDigest(function(done) { - var parentElement = element.parent(); - var elementNode = extractElementNode(element); - var parentNode = elementNode.parentNode; + var cache, parentNode, parentElement, elementNode = extractElementNode(element); + var DOM_FRAGMENT = 11; + if (elementNode) { + cache = element.data(STORAGE_KEY); + element.removeData(STORAGE_KEY); + + parentElement = element.parent(); + parentNode = elementNode.parentNode; + } + // TODO(matsko): move this code into the animationsDisabled() function once #8092 is fixed if (!parentNode || parentNode['$$NG_REMOVED'] || elementNode['$$NG_REMOVED']) { done(); return; } - var cache = element.data(STORAGE_KEY); - element.removeData(STORAGE_KEY); - var state = element.data(NG_ANIMATE_STATE) || {}; var classes = resolveElementClasses(element, cache, state.active); return !classes diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js index be5a1b59e27e..d302fdf8ed4e 100644 --- a/test/ngAnimate/animateSpec.js +++ b/test/ngAnimate/animateSpec.js @@ -543,6 +543,44 @@ describe("ngAnimate", function() { }); }); + it("should clear the setClass element animation cache before the next animation runs", function() { + var animateSpy = jasmine.createSpy(); + module(function($animateProvider) { + $animateProvider.register('.track-me', function() { + return { + addClass: animateSpy, + removeClass: animateSpy, + setClass: animateSpy + }; + }); + }); + inject(function($animate, $rootScope, $sniffer, $$rAF) { + var orphanChild = jqLite('
'); + element.append(orphanChild); + orphanChild.remove(); + + var doneSpy = jasmine.createSpy(); + + $animate.setClass(orphanChild, 'red', 'blue').then(doneSpy); + $rootScope.$digest(); + $animate.triggerCallbacks(); + + expect(doneSpy).toHaveBeenCalled(); + expect(animateSpy).not.toHaveBeenCalled(); + + var specialChild = jqLite('
'); + element.append(specialChild); + + $animate.setClass(specialChild, 'blue', 'gold').then(doneSpy); + $rootScope.$digest(); + $animate.triggerReflow(); + $animate.triggerCallbacks(); + + expect(animateSpy).toHaveBeenCalled(); + }); + }); + + it("should exclusively animate the setClass animation event with native dom elements", function() { var count = 0, fallback = jasmine.createSpy('callback'); module(function($animateProvider) { @@ -4559,8 +4597,8 @@ describe("ngAnimate", function() { }); }); inject(function($compile, $rootScope, $animate, $sniffer, $rootElement) { - $rootElement.addClass('animated'); + $animate.addClass($rootElement, 'green'); $rootScope.$digest(); $animate.triggerReflow();