如何验证输入参数格式?

时间:2015-11-05 14:12:47

标签: angularjs

我想就使用eclipse-test-plugin提供一些具体的帮助和建议。

我有以下规则:

  • 密码必须至少包含一个非字母或数字字符。
  • 密码必须至少有一位数字(' 0' - ' 9')。
  • 密码必须至少有一个大写字母(' A' - ' Z')。

在我的前端,我在HTML中有这个:

ng-pattern

有没有办法可以创建其他<span ng-show="regForm.password.$dirty && !regForm.password.$error.required && !regForm.password.$error.minlength && (aus.password != aus.confirmPassword)"> Passwords do not match </span> 来测试输入是否符合ng-show的其他三个规则?

这是我的ng-pattern

<input>

希望有人可以帮助我解决使用 ng-pattern 的问题。请注意,使用HTML正则表达式 不是一个重复的问题。我正在寻找具体的<input id="password" name="password" ng-model="aus.password" ng-minlength="6" ng-required="true" type="password" value="" /> 帮助。

1 个答案:

答案 0 :(得分:7)

ng-pattern构建一个正则表达式,希望数字大写字母一个特殊字符可能很难管理,尽管有{{ 3}} SO some围绕那将使你朝这个方向前进。作为answers,自定义验证器是更好的方法。它们更灵活,更易于维护,并允许您将各种错误案例分成不同的消息给用户。

@Petr Averyanov suggested自定义验证部分中阅读它们。弹出这个片段进行演示:

&#13;
&#13;
var app = angular.module('validationDemo', ['ngMessages']);

app.directive('strongPassword', function() {
  return {
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
      ctrl.$validators.containsSpecial = function(modelValue, viewValue) {
        if (ctrl.$isEmpty(modelValue)) { return true; }
        if (/[^a-z0-9]/i.test(viewValue)) { return true; }
        return false;
      };
      
      ctrl.$validators.containsDigit = function(modelValue, viewValue) {
        if (ctrl.$isEmpty(modelValue)) { return true; }
        if (/\d/.test(viewValue)) { return true; }
        return false;
      };
      
      ctrl.$validators.containsUppercase = function(modelValue, viewValue) {
        if (ctrl.$isEmpty(modelValue)) { return true; }
        if (/[A-Z]/.test(viewValue)) { return true; }
        return false;
      };
    }
  };
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular-messages.js"></script>

<body ng-app="validationDemo">
  <form name="form" class="css-form" novalidate>
    <div>
      Password:
      <input type="text" ng-model="password" name="password" strong-password /><br />
      {{password}}
      <ul ng-messages="form.password.$error" multiple="true">
        <li ng-message="containsSpecial">
          Your password must contain at least one non-letter, non-digit character
        </li>
        <li ng-message="containsDigit">
          Your password must contain at least one digit
        </li>
        <li ng-message="containsUppercase">
          Your password must contain at least one uppercase letter
        </li>
      </ul>
    </div>
  </form>
</body>
&#13;
&#13;
&#13;

首先为验证者声明Angular's Forms documentation。我们称之为strongPassword

var app = angular.module('validationDemo', []);

app.directive('strongPassword', function() {
  return {
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
      // Validators go here
    }
  };
});

将指令作为HTML属性附加到您的密码input,并使用通常的camelCase进行短划分转换。

<body ng-app="validationDemo">
  <form name="form" class="css-form" novalidate>
    <div>
      Password:
      <input type="text" ng-model="password" name="password" strong-password /><br />
      {{password}}
    </div>
  </form>
</body>

对于您要添加的每个验证,请在ctrl.$validators上的指令中设置一个键。因此,要验证密码是否包含数字,

link: function(scope, elm, attrs, ctrl) {
  ctrl.$validators.containsDigit = function(modelValue, viewValue) {
    if (ctrl.$isEmpty(modelValue)) { return true; } // They haven't typed yet
    if (/\d/.test(viewValue)) { return true; } // Found a digit
    return false;
  };
}

然后,您可以访问form.<element name>.$error上的错误,在本例中为form.password.$error.containsDigit。使用ng-messages指令(确保导入angular-messages.js)以向用户显示错误。

<ul ng-messages="form.password.$error" multiple="true">
  <li ng-message="containsDigit">
    Your password must contain at least one digit
  </li>
</ul>

ng-messages的值是表单上的错误对象,每个ng-message都会在$error上描述一个您想要打印的值的键。 multiple选项告诉Angular一次显示所有消息;否则,你一次只能获得一个。