I currently have an angular directive that checks the password and confirms the password field as appropriate. This works to some extent, it throws an error when the passwords do not match. However, it does not throw an error until you enter data in both fields. How can I make the error for mismatched passwords appear as soon as you enter data in one or the other field?
Here is the directive (it must be added to both fields that must match):
.directive('passwordVerify', function() { return { restrict: 'A', // only activate on element attribute require: '?ngModel', // get a hold of NgModelController link: function(scope, elem, attrs, ngModel) { //if (!ngModel) return; // do nothing if no ng-model // watch own value and re-validate on change scope.$watch(attrs.ngModel, function() { validate(); }); // observe the other value and re-validate on change attrs.$observe('passwordVerify', function(val) { validate(); }); var validate = function() { // values var val1 = ngModel.$viewValue; var val2 = attrs.passwordVerify; // set validity ngModel.$setValidity('passwordVerify', !val1 || !val2 || val1 === val2); }; } }; });
And here is the directive in my form:
<div class="small-5 columns"> <div class="small-12 columns"> <label> Password <input ng-class="{ notvalid: submitted && add_user_form.user_password.$invalid }" class="instructor-input" id="user_password" type="password" name='user_password' placeholder="password" value='' required ng-model="user.user_password" password-verify="[[user.confirm_password]]" > </label> <p class="help-text"> <span class=" ">Required</span> </p> <div class="help-block" ng-messages="add_user_form.user_password.$error" ng-show="add_user_form.user_password.$touched || add_user_form.user_password.$dirty" > <span class="red"> <div ng-messages-include="/app/views/messages.html" ></div> </span> </div> </div> <div class="small-12 columns"> <label> Confirm Password <input ng-class="{ notvalid: submitted && add_user_form.confirm_password.$invalid }" class="instructor-input" id="confirm_password" ng-model="user.confirm_password" name="confirm_password" type="password" placeholder="confirm password" name="user_confirm_passsword" required password-verify="[[user.user_password]]" > </label> <p class="help-text"> <span class=" "> Enter matching password </span> </p> <div class="help-block" ng-messages="add_user_form.confirm_password.$error" ng-show="add_user_form.confirm_password.$dirty || add_user_form.confirm_password.$touched " > <span class="red"> <div ng-messages-include="/app/views/messages.html" ></div> </span> </div> </div>
source share