Как я могу проверить формат входного параметра?

Мне нужна конкретная помощь и совет по использованию ng-pattern.

У меня есть следующие правила:

  • Пароли должны содержать хотя бы один символ, отличный от буквы или цифры.
  • Пароли должны состоять как минимум из одной цифры ('0'-'9').
  • Пароли должны иметь по крайней мере одну прописную букву ('A'-'Z').

На моем интерфейсе у меня есть это в HTML:

<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>

<input id="password"
       name="password"
       ng-model="aus.password"
       ng-minlength="6"
       ng-required="true"
       type="password"
       value="" />

Надеюсь, кто-нибудь поможет мне с ответом на этот вопрос, который использует ng-pattern. Обратите внимание, что это не повторяющийся вопрос об использовании регулярного выражения HTML. Мне нужна конкретная ng-pattern помощь.


person Community    schedule 05.11.2015    source источник
comment
Я думаю, что добавление пользовательского валидатора здесь правильно, поскольку вам нужно не только проверить, но и показать соответствующее сообщение об ошибке.   -  person Petr Averyanov    schedule 05.11.2015
comment
@PetrAveryanov - есть ли у вас предложения, как это можно сделать? Спасибо, М   -  person    schedule 05.11.2015


Ответы (1)


Создание регулярного выражения для ng-pattern, которое ожидает цифру, и прописную букву, и специальный символ, может оказаться сложным в управлении, хотя существуют some SO ответы вокруг этого направят вас в этом направлении. Как предложил @Petr Averyanov, пользовательские валидаторы — это лучший способ пойти. Они более гибкие, простые в обслуживании и позволяют разделить различные случаи ошибок на разные сообщения для пользователя.

Ознакомьтесь с ними в разделе Пользовательская проверка в Angular. Документация по формам. Откройте этот фрагмент для демонстрации:

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;
      };
    }
  };
});
<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>

Вы начинаете с объявления директивы для своих валидаторов. Мы назовем это strongPassword.

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

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

Прикрепите директиву к вашему паролю input в качестве HTML-атрибута с обычным преобразованием верблюжьего регистра в тире.

<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 отображать все сообщения одновременно; в противном случае вы получаете только один за раз.

person Kristján    schedule 07.11.2015
comment
у вас есть другой вариант использования API ngMessages, docs.angularjs.org/api/ngMessages/ директива/ngMessages, которая очень удобна и понятна, а также уменьшает объем кода, который необходимо написать для показа\скрытия сообщений. - person Ran Sasportas; 10.11.2015
comment
@RanSasportas Спасибо! Я преобразовал код для использования ng-messages, это несколько лучше. - person Kristján; 14.11.2015