Tengo un formulario que, si una casilla de verificación es falsa, aplica la validación en una entrada de texto usando la directiva ng-required. Si la casilla de verificación es verdadera, el campo está oculto y ng-required se establece en falso.
El problema es que también tengo una expresión regular para la validación especificada en la entrada, además de utilizar la directiva angular ng-pattern. El problema con el que me estoy encontrando es que si un usuario completa un número de teléfono no válido, marca la casilla para desactivar esa entrada (y, en consecuencia, no necesita más validación), el formulario no permitirá el envío, ya que no es válido según el patrón ng.
Intenté resolver este problema agregando una función ng-change para establecer el modelo de entrada en nulo, sin embargo, el patrón ng y, por lo tanto, el campo todavía está configurado como no válido en el conjunto inicial de la casilla de verificación en falso. Sin embargo, si desmarco la casilla, estableciendo todo de nuevo en la carga inicial del formulario, luego vuelvo a marcar la casilla, el formulario es válido y se puede enviar. No estoy seguro de lo que me estoy perdiendo. Aquí está el código ng-change que tengo hasta ahora:
var phoneNumberRegex = /^\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})$/;
$scope.phoneNumberPattern = phoneNumberRegex;
$scope.removeValidation = function() {
if ($scope.cell._newUser === false) {
$scope.request._number = '';
$scope.phoneNumberPattern = /[0-9a-zA-Z]?/;
} else {
$scope.phoneNumberPattern = phoneNumberRegex;
}
};
test
método. Es por eso que le damos un objeto con nuestra propia costumbretest()
, emulando esencialmente un JS nativoRegExp
. 2) Porvalue
supuesto, Angular lo pasa al ejecutar la verificación de validez real.Sin quitarle nada a la asombrosa respuesta de Nikos, tal vez pueda hacer esto de manera más simple:
<form name="telForm"> <input name="cb" type='checkbox' data-ng-modal='requireTel'> <input name="tel" type="text" ng-model="..." ng-if='requireTel' ng-pattern="phoneNumberPattern" required/> <button type="submit" ng-disabled="telForm.$invalid || telForm.$pristine">Submit</button> </form>
Preste atención a la segunda entrada: podemos usar an
ng-if
para controlar la representación y la validación en formularios. Si larequireTel
variable no está configurada, la segunda entrada no solo se ocultará, sino que no se representará en absoluto, por lo que el formulario pasará la validación y el botón se habilitará, y obtendrá lo que necesita.fuente
Patrón utilizado:
ng-pattern="/^\d{0,9}(\.\d{1,9})?$/"
Archivo de referencia utilizado:
'<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>'
Ejemplo de entrada:
<input type="number" require ng-pattern="/^\d{0,9}(\.\d{1,9})?$/"><input type="submit">
fuente
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>
<input type="number" require ng-pattern="/^\d{0,9}(\.\d{1,9})?$/"><input type="submit">
fuente
Me encontré con esto el otro día.
Lo que hice, que parece más fácil que lo anterior, es establecer el patrón en una variable en el alcance y referirme a él en ng-patrón en la vista.
Cuando "la casilla de verificación no está marcada", simplemente establezco el valor de expresión regular en /.*/ en la devolución de llamada onChanged (si no está marcada). ng-pattern toma ese cambio y dice "OK, tu valor está bien". El formulario ahora es válido. También eliminaría los datos incorrectos del campo para que no tenga un teléfono aparentemente defectuoso # sentado allí.
Tuve problemas adicionales relacionados con ng-required e hice lo mismo. Trabajado como un encanto.
fuente
Parece que una respuesta más votada en esta pregunta debería actualizarse, porque cuando lo intento, no aplica la
test
función y la validación no funciona.El ejemplo de Angular docs funciona bien para mí:
Modificación de validadores integrados
html
<form name="form" class="css-form" novalidate> <div> Overwritten Email: <input type="email" ng-model="myEmail" overwrite-email name="overwrittenEmail" /> <span ng-show="form.overwrittenEmail.$error.email">This email format is invalid!</span><br> Model: {{myEmail}} </div> </form>
js
var app = angular.module('form-example-modify-validators', []); app.directive('overwriteEmail', function() { var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@example\.com$/i; return { require: 'ngModel', restrict: '', link: function(scope, elm, attrs, ctrl) { // only apply the validator if ngModel is present and Angular has added the email validator if (ctrl && ctrl.$validators.email) { // this will overwrite the default Angular email validator ctrl.$validators.email = function(modelValue) { return ctrl.$isEmpty(modelValue) || EMAIL_REGEXP.test(modelValue); }; } } }; });
Plunker
fuente
Puede utilizar el sitio https://regex101.com/ para crear su propio patrón específico para algún país:
Por ejemplo, Polonia:
-pattern = xxxxxxxxx OR xxx-xxx-xxx OR xxx xxx xxx -regexp ="^\d{9}|^\d{3}-\d{3}-\d{3}|^\d{3}\s\d{3}\s\d{3}"
fuente