Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
fix($animate): ensure former nodes are fully cleaned up when a follow…
Browse files Browse the repository at this point in the history
…-up structural animation takes place

Closes #4435
  • Loading branch information
matsko committed Oct 29, 2013
1 parent 3d4c80c commit 7f0767a
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/ngAnimate/animate.js
Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,7 @@ angular.module('ngAnimate', ['ng'])
//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.flagTimer);
cleanup(element);
cancelAnimations(ngAnimateState.animations);
(ngAnimateState.done || noop)();
}
Expand Down Expand Up @@ -700,25 +701,24 @@ angular.module('ngAnimate', ['ng'])
return rootAnimateState.disabled || rootAnimateState.running;
}

var validState;
do {
//the element did not reach the root element which means that it
//is not apart of the DOM. Therefore there is no reason to do
//any animations on it
if(parent.length === 0) return true;
if(parent.length === 0) break;

var isRoot = parent[0] == $rootElement[0];
var state = isRoot ? rootAnimateState : parent.data(NG_ANIMATE_STATE);
if(state && (state.disabled != null || state.running != null)) {
validState = state;
break;
var result = state && (!!state.disabled || !!state.running);
if(isRoot || result) {
return result;
}

if(isRoot) return true;
}
while(parent = parent.parent());

return validState ? (validState.disabled || validState.running) : true;
return true;
}
}]);

Expand Down
36 changes: 36 additions & 0 deletions test/ngAnimate/animateSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1817,6 +1817,42 @@ describe("ngAnimate", function() {
// expect(element.hasClass('hiding')).toBe(false);
// });
// });
it("should remove all the previous classes when the next animation is applied before a reflow", function() {
var fn, interceptedClass;
module(function($animateProvider) {
$animateProvider.register('.three', function() {
return {
move : function(element, done) {
fn = function() {
done();
}
return function() {
interceptedClass = element.attr('class');
}
}
}
});
});
inject(function($compile, $rootScope, $animate, $timeout) {
var parent = html($compile('<div class="parent"></div>')($rootScope));
var one = $compile('<div class="one"></div>')($rootScope);
var two = $compile('<div class="two"></div>')($rootScope);
var three = $compile('<div class="three klass"></div>')($rootScope);

parent.append(one);
parent.append(two);
parent.append(three);

$animate.move(three, null, two);
$rootScope.$digest();

$animate.move(three, null, one);
$rootScope.$digest();

//this means that the former animation was cleaned up before the new one starts
expect(interceptedClass.indexOf('ng-animate') >= 0).toBe(false);
});
});

it("should provide the correct CSS class to the addClass and removeClass callbacks within a JS animation", function() {
module(function($animateProvider) {
Expand Down

0 comments on commit 7f0767a

Please sign in to comment.