带有验证的密码字段和AngularJS中的“显示密码”选项

时间:2014-01-16 12:23:22

标签: javascript validation angularjs

我正在尝试创建一个符合以下条件的密码字段:

  1. 有效密码长度应为6到24个符号,且至少有一位数字。
  2. 当该字段包含无效密码时,它应始终具有.ng-invalid class。
  3. 要使密码符号可见,我使用两个通过模型同步的输入:

    <form name="form" ng-app="myApp" ng-controller="Controller" novalidate>    
    <label>
       Password:
        <input type="password" name="uPass" maxlength="24" ng-hide="formFlags.showpass" ng-model="user.pass" ng-required validate-pass />   
        <input type="text" name="uPass" maxlength="24" ng-show="formFlags.showpass" ng-model="user.pass" ng-required validate-pass />
        <span class="message" ng-show="form.uPass.$dirty && form.uPass.$invalid">Must be from 6 to 24 symbols long ang contain at least one digit.</span> 
    </label>
    
    <label>
        <input type="checkbox" name="uShowPass" ng-model="formFlags.showpass" toggle-pass/>Show password
    </label>    
    </form>
    

    请在此处查看完整代码:http://jsfiddle.net/adept/9uCGQ/44/

    我在这里尝试执行以下操作:

    1. 我输入的密码无效。输入字段get.ng-invalid class (红色边框)。
    2. 点击“显示密码”。密码输入得到     隐藏的文本输入变得可见。
    3. 问题是在我改变它的值之前没有验证。如何在显示后立即进行验证?

      AngularJS版本1.2.x及更高版本中的

      UPD:我的示例正常运行,此问题仅适用于较低版本。

1 个答案:

答案 0 :(得分:6)

也可以添加formatters.unshift,因此它也会查看模型更改,而不仅仅是查看更改。

编辑小提琴:

http://jsfiddle.net/9uCGQ/5/

添加了代码:

       ctrl.$formatters.unshift(function(viewValue) {
            if (viewValue.length >= scope.formFlags.minpasslength && PASS_REGEXP.test(viewValue)) {
                // it is valid
                ctrl.$setValidity('pass', true);
            } else {
                // it is invalid
                ctrl.$setValidity('pass', false);
            } 
            // update model anyway to sync password fields
            return viewValue;
        });

有关ng-controller文档中的两个属性(解析器和格式化程序)的更多信息:http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController