使用 Angular 指令在一个或其他字段模型更改(每次击键)时验证密码和确认密码字段 [英] Validating Password And Confirm Password Fields Whenever One Or The Other Fields Model Changes (Each Keystroke) With Angular Directive
问题描述
我目前有一个 Angular 指令,用于验证密码并确认密码字段匹配.它在某种程度上起作用,当密码不匹配时它确实会引发错误.但是,在您在两个字段中都输入数据之前,它不会引发错误.我如何才能在您在一个或另一个字段中输入数据时立即抛出密码不匹配的错误?
这是指令(必须将其添加到需要匹配的两个字段中):
.directive('passwordVerify', function() {返回 {限制: 'A',//只在元素属性上激活require: '?ngModel',//获取 NgModelController链接:功能(范围,元素,属性,ngModel){//如果(!ngModel)返回;//如果没有 ng-model 则什么都不做//观察自己的值并在变化时重新验证scope.$watch(attrs.ngModel, function() {证实();});//观察另一个值并在更改时重新验证attrs.$observe('passwordVerify', function(val) {证实();});var 验证 = 函数(){//值var val1 = ngModel.$viewValue;var val2 = attrs.passwordVerify;//设置有效性ngModel.$setValidity('passwordVerify', !val1 || !val2 || val1 === val2);};}};});
这是我表单中的指令:
<div class="small-12 列"><标签>密码<输入ng-class="{ notvalid: 提交 && add_user_form.user_password.$invalid }"类=教师输入"id="用户密码"类型=密码"名称='用户_密码'占位符=密码"值=''必需的ng-model="user.user_password"密码验证="[[user.confirm_password]]">标签><p class="help-text"><span class=" ">必需</span></p><div class="small-12 列"><标签>确认密码<输入ng-class="{ 无效:已提交 && add_user_form.confirm_password.$invalid }"类=教师输入"id="confirm_password"ng-model="user.confirm_password"名称=确认密码"类型=密码"占位符=确认密码"名称=用户确认密码"必需的密码验证="[[user.user_password]]">标签><p class="help-text"><span class="">输入匹配的密码</span></p>
解决方案 只需更改最后一个检查:
ngModel.$setValidity('passwordVerify', !val1 || !val2 || val1 === val2);
到:
ngModel.$setValidity('passwordVerify', val1 === val2);
这是一个工作版本:
(function() {严格使用";有角的.module('app', ['ngMessages']).controller('mainCtrl', mainCtrl).directive('passwordVerify', passwordVerify);函数 mainCtrl($scope) {//一些代码}函数密码验证(){返回 {限制: 'A',//只在元素属性上激活require: '?ngModel',//获取 NgModelController链接:功能(范围,元素,属性,ngModel){如果(!ngModel)返回;//如果没有 ng-model 则什么都不做//观察自己的值并在变化时重新验证scope.$watch(attrs.ngModel, function() {证实();});//观察另一个值并在更改时重新验证attrs.$observe('passwordVerify', function(val) {证实();});var 验证 = 函数(){//值var val1 = ngModel.$viewValue;var val2 = attrs.passwordVerify;//设置有效性ngModel.$setValidity('passwordVerify', val1 === val2);};}}}})();
<头><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>头部><body ng-controller="mainCtrl"><表单名称="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">输入密码</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">这个字段是必填的</p><p ng-message="minlength">这个字段太短了</p><p ng-message="maxlength">这个字段太长</p><p ng-message="required">这个字段是必填的</p><p ng-message="passwordVerify">不匹配!</p>
<div class="form-group" ng-class="{ 'has-error' : add_user_form.confirm_password.$dirty && add_user_form.confirm_password.$invalid }"><p class="help-text">输入匹配的密码</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.用户密码}}"><div class="help-block" ng-messages="add_user_form.confirm_password.$error" ng-if="add_user_form.confirm_password.$dirty"><p ng-message="required">这个字段是必填的</p><p ng-message="minlength">这个字段太短了</p><p ng-message="maxlength">这个字段太长</p><p ng-message="required">这个字段是必填的</p><p ng-message="passwordVerify">不匹配!</p>
</表单></html>