From 21b77ad5c231ab0e05eb89f22005f7ed8d40a6c1 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 3 Apr 2012 22:05:13 -0700 Subject: fix(form): preperly clean up when invalid widget is removed Removing invalid widget sometimes resulted in improper cleanup of the form state.--- src/ng/directive/form.js | 61 ++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 33 deletions(-) (limited to 'src/ng/directive/form.js') diff --git a/src/ng/directive/form.js b/src/ng/directive/form.js index 7b96c936..f688b542 100644 --- a/src/ng/directive/form.js +++ b/src/ng/directive/form.js @@ -70,23 +70,43 @@ function FormController(element, attrs) { if (control.$name && form[control.$name] === control) { delete form[control.$name]; } - forEach(errors, cleanupControlErrors, control); + forEach(errors, function(queue, validationToken) { + form.$setValidity(validationToken, true, control); + }); }; form.$setValidity = function(validationToken, isValid, control) { - if (isValid) { - cleanupControlErrors(errors[validationToken], validationToken, control); + var queue = errors[validationToken]; - if (!invalidCount) { - toggleValidCss(isValid); - form.$valid = true; - form.$invalid = false; + if (isValid) { + if (queue) { + arrayRemove(queue, control); + if (!queue.length) { + invalidCount--; + if (!invalidCount) { + toggleValidCss(isValid); + form.$valid = true; + form.$invalid = false; + } + errors[validationToken] = false; + toggleValidCss(true, validationToken); + parentForm.$setValidity(validationToken, true, form); + } } + } else { if (!invalidCount) { toggleValidCss(isValid); } - addControlError(validationToken, control); + if (queue) { + if (includes(queue, control)) return; + } else { + errors[validationToken] = queue = []; + invalidCount++; + toggleValidCss(false, validationToken); + parentForm.$setValidity(validationToken, false, form); + } + queue.push(control); form.$valid = false; form.$invalid = true; @@ -99,31 +119,6 @@ function FormController(element, attrs) { form.$pristine = false; }; - function cleanupControlErrors(queue, validationToken, control) { - if (queue) { - control = control || this; // so that we can be used in forEach; - arrayRemove(queue, control); - if (!queue.length) { - invalidCount--; - errors[validationToken] = false; - toggleValidCss(true, validationToken); - parentForm.$setValidity(validationToken, true, form); - } - } - } - - function addControlError(validationToken, control) { - var queue = errors[validationToken]; - if (queue) { - if (includes(queue, control)) return; - } else { - errors[validationToken] = queue = []; - invalidCount++; - toggleValidCss(false, validationToken); - parentForm.$setValidity(validationToken, false, form); - } - queue.push(control); - } } -- cgit v1.2.3