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

Commit d7548fd

Browse files
committed
fix(form): ensure concurrent animations use setClass
When addClass and removeClass are called in parallel it may cause follow-up animations to get blocked. This fix ensures that the validity state CSS classes are applied at the same time via $animate.setClass. Closes #8166
1 parent 7e239f9 commit d7548fd

File tree

2 files changed

+11
-18
lines changed

2 files changed

+11
-18
lines changed

src/ng/directive/form.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ function FormController(element, attrs, $scope, $animate) {
7070
// convenience method for easy toggling of classes
7171
function toggleValidCss(isValid, validationErrorKey) {
7272
validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
73-
$animate.removeClass(element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);
74-
$animate.addClass(element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
73+
$animate.setClass(element,
74+
(isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey,
75+
(isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);
7576
}
7677

7778
/**

test/ng/directive/formSpec.js

+8-16
Original file line numberDiff line numberDiff line change
@@ -621,10 +621,8 @@ describe('form animations', function() {
621621
it('should trigger an animation when invalid', inject(function($animate) {
622622
form.$setValidity('required', false);
623623

624-
assertValidAnimation($animate.queue[0], 'removeClass', 'ng-valid');
625-
assertValidAnimation($animate.queue[1], 'addClass', 'ng-invalid');
626-
assertValidAnimation($animate.queue[2], 'removeClass', 'ng-valid-required');
627-
assertValidAnimation($animate.queue[3], 'addClass', 'ng-invalid-required');
624+
assertValidAnimation($animate.queue[0], 'setClass', 'ng-invalid', 'ng-valid');
625+
assertValidAnimation($animate.queue[1], 'setClass', 'ng-invalid-required', 'ng-valid-required');
628626
}));
629627

630628
it('should trigger an animation when valid', inject(function($animate) {
@@ -634,10 +632,8 @@ describe('form animations', function() {
634632

635633
form.$setValidity('required', true);
636634

637-
assertValidAnimation($animate.queue[0], 'removeClass', 'ng-invalid');
638-
assertValidAnimation($animate.queue[1], 'addClass', 'ng-valid');
639-
assertValidAnimation($animate.queue[2], 'removeClass', 'ng-invalid-required');
640-
assertValidAnimation($animate.queue[3], 'addClass', 'ng-valid-required');
635+
assertValidAnimation($animate.queue[0], 'setClass', 'ng-valid', 'ng-invalid');
636+
assertValidAnimation($animate.queue[1], 'setClass', 'ng-valid-required', 'ng-invalid-required');
641637
}));
642638

643639
it('should trigger an animation when dirty', inject(function($animate) {
@@ -661,17 +657,13 @@ describe('form animations', function() {
661657
it('should trigger custom errors as addClass/removeClass when invalid/valid', inject(function($animate) {
662658
form.$setValidity('custom-error', false);
663659

664-
assertValidAnimation($animate.queue[0], 'removeClass', 'ng-valid');
665-
assertValidAnimation($animate.queue[1], 'addClass', 'ng-invalid');
666-
assertValidAnimation($animate.queue[2], 'removeClass', 'ng-valid-custom-error');
667-
assertValidAnimation($animate.queue[3], 'addClass', 'ng-invalid-custom-error');
660+
assertValidAnimation($animate.queue[0], 'setClass', 'ng-invalid', 'ng-valid');
661+
assertValidAnimation($animate.queue[1], 'setClass', 'ng-invalid-custom-error', 'ng-valid-custom-error');
668662

669663
$animate.queue = [];
670664
form.$setValidity('custom-error', true);
671665

672-
assertValidAnimation($animate.queue[0], 'removeClass', 'ng-invalid');
673-
assertValidAnimation($animate.queue[1], 'addClass', 'ng-valid');
674-
assertValidAnimation($animate.queue[2], 'removeClass', 'ng-invalid-custom-error');
675-
assertValidAnimation($animate.queue[3], 'addClass', 'ng-valid-custom-error');
666+
assertValidAnimation($animate.queue[0], 'setClass', 'ng-valid', 'ng-invalid');
667+
assertValidAnimation($animate.queue[1], 'setClass', 'ng-valid-custom-error', 'ng-invalid-custom-error');
676668
}));
677669
});

0 commit comments

Comments
 (0)