I am having major problems with the form. Here is what I did.
I snatched this cool directive from here: https://github.com/TheSharpieOne/angular-input-match
It looks like this:
directive('match', function () { return { require: 'ngModel', restrict: 'A', scope: { match: '=' }, link: function(scope, elem, attrs, ngModel) { scope.$watch(function() { return (ngModel.$pristine && angular.isUndefined(ngModel.$modelValue)) || scope.match === ngModel.$viewValue; }, function(currentValue, previousValue) { ngModel.$setValidity('match', currentValue); }); } }; });
Essentially, this directive oversees the element that it is bound to the model value and compares it with the model value in the match attribute.
So ... for example, below we see if both passwords match:
Password: <input ng-model="password" type="password" /> Confirm: <input ng-model="passwordConfirm" type="password" match="password" />
This directive seems to work, as it sets ng-valid-match and ng-invalid-match to match accordingly.
However, once it is set to invalid, the passwordConfirm model will never be updated again. I made a ton of console.loggin looking at ngModel in the directive, and here is what it looks like when both passwords match:
Constructor {$viewValue: "asdf", $modelValue: undefined, $validators: Object, $parsers: Array[0], $formatters: Array[0]β¦} $$debounceViewValueCommit: function (trigger, revalidate) { $$invalidModelValue: "asdf" $$lastCommittedViewValue: "asdf" $$runValidators: function (modelValue, viewValue) { $$validityState: ValidityState $$writeModelToScope: function () { $commitViewValue: function (revalidate) { $dirty: true $error: Object $formatters: Array[0] $invalid: false $isEmpty: function (value) { $modelValue: undefined $name: "passwordConfirmation" $parsers: Array[0] $pristine: false $render: function () { $rollbackViewValue: function () { $setPristine: function () { $setTouched: function () { $setUntouched: function () { $setValidity: function (validationErrorKey, isValid) { $setViewValue: function (value, trigger, revalidate) { $touched: true $untouched: false $valid: true $validate: function () { $validators: Object $viewChangeListeners: Array[0] $viewValue: "asdf" __proto__: Object
Note that the value of $ viewValue is correct, but the value of $ modelValue is specified as undefined, and $ invalidModelValue still matters.
Here is what html looks like again when both passwords match:
<input type="password" class="form-control ng-isolate-scope ng-dirty ng-valid-required ng-valid ng-valid-match ng-touched" id="passwordConfirmation" name="passwordConfirmation" placeholder="Confirm your password" ng-model="passwordConfirmation" required="" match="password" style="">
Am I missing something? I worked in circles several times.