我目前有一个Angular Directive,用于验证密码并确认密码字段为匹配.它起作用,当密码不匹配时它会抛出错误.但是,在两个字段中输入数据之前,它不会抛出错误.如何在一个字段或另一个字段中输入数据后立即抛出不匹配密码的错误?
这是指令(必须将其添加到需要匹配的两个字段中):
.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); }; } }; });
以下是我的表格中的指令:
<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>
只需更改最后一次检查:
原文链接:https://www.f2er.com/angularjs/143726.htmlngModel.$setValidity('passwordVerify',!val1 || !val2 || val1 === val2);
至:
ngModel.$setValidity('passwordVerify',val1 === val2);
这是一个工作版本:
(function() { "use strict"; angular .module('app',['ngMessages']) .controller('mainCtrl',mainCtrl) .directive('passwordVerify',passwordVerify); function mainCtrl($scope) { // Some code } function passwordVerify() { return { restrict: 'A',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); }; } } } })();
<html ng-app="app"> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-messages/1.5.7/angular-messages.min.js"></script> </head> <body ng-controller="mainCtrl"> <form name="add_user_form"> <div class="col-md-12"> <div class="form-group" ng-class="{ 'has-error' : add_user_form.user_password.$dirty && add_user_form.user_password.$invalid }"> <p class="help-text">Enter password</p> <input type="password" class="form-control" id="user_password" name="user_password" placeholder="password" required ng-model="user.user_password" password-verify="{{user.confirm_password}}"> <div class="help-block" ng-messages="add_user_form.user_password.$error" ng-if="add_user_form.user_password.$dirty"> <p ng-message="required">This field is required</p> <p ng-message="minlength">This field is too short</p> <p ng-message="maxlength">This field is too long</p> <p ng-message="required">This field is required</p> <p ng-message="passwordVerify">No match!</p> </div> </div> <div class="form-group" ng-class="{ 'has-error' : add_user_form.confirm_password.$dirty && add_user_form.confirm_password.$invalid }"> <p class="help-text">Enter matching password</p> <input class="form-control" id="confirm_password" ng-model="user.confirm_password" name="confirm_password" type="password" placeholder="confirm password" required password-verify="{{user.user_password}}"> <div class="help-block" ng-messages="add_user_form.confirm_password.$error" ng-if="add_user_form.confirm_password.$dirty"> <p ng-message="required">This field is required</p> <p ng-message="minlength">This field is too short</p> <p ng-message="maxlength">This field is too long</p> <p ng-message="required">This field is required</p> <p ng-message="passwordVerify">No match!</p> </div> </div> </div> </form> </body> </html>
我希望它有所帮助.