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

Commit 2408f2d

Browse files
committed
fix(form): clean up success state of controls when they are removed
Fixes #10509
1 parent 1bf1a62 commit 2408f2d

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

src/ng/directive/form.js

+3
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
163163
forEach(form.$error, function(value, name) {
164164
form.$setValidity(name, null, control);
165165
});
166+
forEach(form.$$success, function(value, name) {
167+
form.$setValidity(name, null, control);
168+
});
166169

167170
arrayRemove(controls, control);
168171
};

test/ng/directive/formSpec.js

+20-3
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ describe('form', function() {
463463
doc = jqLite(
464464
'<form name="parent">' +
465465
'<div class="ng-form" name="child">' +
466-
'<input ng-if="inputPresent" ng-model="modelA" name="inputA" required>' +
466+
'<input ng-if="inputPresent" ng-model="modelA" name="inputA" required maxlength="10">' +
467467
'</div>' +
468468
'</form>');
469469
$compile(doc)(scope);
@@ -476,23 +476,40 @@ describe('form', function() {
476476

477477
expect(parent).toBeDefined();
478478
expect(child).toBeDefined();
479+
479480
expect(parent.$error.required).toEqual([child]);
481+
expect(parent.$$success.maxlength).toEqual([child]);
482+
480483
expect(child.$error.required).toEqual([input]);
484+
expect(child.$$success.maxlength).toEqual([input]);
485+
481486
expect(doc.hasClass('ng-invalid')).toBe(true);
482487
expect(doc.hasClass('ng-invalid-required')).toBe(true);
488+
expect(doc.hasClass('ng-valid-maxlength')).toBe(true);
483489
expect(doc.find('div').hasClass('ng-invalid')).toBe(true);
484490
expect(doc.find('div').hasClass('ng-invalid-required')).toBe(true);
491+
expect(doc.find('div').hasClass('ng-valid-maxlength')).toBe(true);
485492

486493
//remove child input
487-
scope.inputPresent = false;
488-
scope.$apply();
494+
scope.$apply('inputPresent = false');
489495

490496
expect(parent.$error.required).toBeFalsy();
497+
expect(parent.$$success.maxlength).toBeFalsy();
498+
491499
expect(child.$error.required).toBeFalsy();
500+
expect(child.$$success.maxlength).toBeFalsy();
501+
492502
expect(doc.hasClass('ng-valid')).toBe(true);
493503
expect(doc.hasClass('ng-valid-required')).toBe(false);
504+
expect(doc.hasClass('ng-invalid-required')).toBe(false);
505+
expect(doc.hasClass('ng-valid-maxlength')).toBe(false);
506+
expect(doc.hasClass('ng-invalid-maxlength')).toBe(false);
507+
494508
expect(doc.find('div').hasClass('ng-valid')).toBe(true);
495509
expect(doc.find('div').hasClass('ng-valid-required')).toBe(false);
510+
expect(doc.find('div').hasClass('ng-invalid-required')).toBe(false);
511+
expect(doc.find('div').hasClass('ng-valid-maxlength')).toBe(false);
512+
expect(doc.find('div').hasClass('ng-invalid-maxlength')).toBe(false);
496513
});
497514

498515
it('should leave the parent form invalid when deregister a removed input', function() {

0 commit comments

Comments
 (0)