Tengo un formulario con campos de entrada y configuración de validación agregando los required
atributos y demás. Pero para algunos campos necesito hacer una validación adicional. ¿Cómo "aprovecharía" la validación que FormController
controla?
La validación personalizada podría ser algo así como "si se completan estos 3 campos, entonces este campo es obligatorio y debe formatearse de una manera particular".
Hay un método FormController.$setValidity
pero no parece una API pública, así que prefiero no usarlo. Crear una directiva personalizada y usarla NgModelController
parece otra opción, pero básicamente requeriría que creara una directiva para cada regla de validación personalizada, lo que no quiero.
En realidad, marcar un campo del controlador como no válido (aunque también se mantiene FormController
sincronizado) podría ser lo que necesito en el escenario más simple para hacer el trabajo, pero no sé cómo hacerlo.
formName.$warning
.$$
precede a las API no públicas, con$
ser público. Ver stackoverflow.com/questions/19338493/…Respuestas:
Editar: se agregó información sobre ngMessages (> = 1.3.X) a continuación.
Mensajes de validación de formulario estándar (1.0.X y superior)
Dado que este es uno de los mejores resultados si Google "Validación de forma angular", actualmente, quiero agregar otra respuesta a esto para cualquier persona que venga desde allí.
Es "público", no se preocupe. Úsalo. Para eso es. Si no estuviera destinado a ser utilizado, los desarrolladores angulares lo habrían privatizado en un cierre.
Para hacer una validación personalizada, si no desea utilizar Angular-UI como sugiere la otra respuesta, simplemente puede rodar su propia directiva de validación.
Y aquí hay un ejemplo de uso:
Nota: en la 1.2.X es probablemente preferible sustituir
ng-if
porng-show
encimaAquí hay un enlace obligatorio de plunker
Además, he escrito algunas entradas de blog sobre este tema que entra en un poco más de detalle:
Validación de forma angular
Directivas de validación personalizada
Editar: usando ngMessages en 1.3.X
Ahora puede usar el módulo ngMessages en lugar de ngShow para mostrar sus mensajes de error. Realmente funcionará con cualquier cosa, no tiene que ser un mensaje de error, pero aquí está lo básico:
<script src="angular-messages.js"></script>
Referencia
ngMessages
en la declaración de su módulo:Agregue el marcado apropiado:
En el marcado anterior,
ng-message="personForm.email.$error"
básicamente especifica un contexto para lasng-message
directivas secundarias. Luegong-message="required"
yng-message="email"
especifique las propiedades en ese contexto para ver. Lo más importante, también especifican un orden para registrarlos . El primero que encuentre en la lista que sea "verdadero" gana, y mostrará ese mensaje y ninguno de los otros.Y un plunker para el ejemplo ngMessages
fuente
return value ? valid : undefined
anterior.El proyecto de Angular-UI incluye una directiva ui-validate, que probablemente lo ayudará con esto. Le permite especificar una función para llamar para hacer la validación.
Eche un vistazo a la página de demostración: http://angular-ui.github.com/ , busque el encabezado Validar.
Desde la página de demostración:
luego en su controlador:
fuente
Puede usar ng-required para su escenario de validación ("si se completan estos 3 campos, entonces este campo es obligatorio":
fuente
Puedes usar Angular-Validator .
Ejemplo: uso de una función para validar un campo
Entonces en tu controlador tendrías algo como
También puedes hacer algo como esto:
(donde field1 field2 y field3 son variables de alcance. También es posible que desee comprobar si los campos no son iguales a la cadena vacía)
Si el campo no pasa
validator
, el campo se marcará como no válido y el usuario no podrá enviar el formulario.Para obtener más casos de uso y ejemplos, consulte: https://github.com/turinggroup/angular-validator
Descargo de responsabilidad: soy el autor de Angular-Validator
fuente
Recientemente creé una directiva para permitir la invalidación basada en expresiones de entradas de forma angular. Se puede utilizar cualquier expresión angular válida, y admite claves de validación personalizadas mediante notación de objeto. Probado con angular v1.3.8
Puedes usarlo así:
O simplemente pasando una expresión (se le dará la clave de validación predeterminada de "invalidIf")
fuente
Aquí hay una forma genial de hacer validaciones de expresiones comodín personalizadas en un formulario (de: Validación avanzada de formularios con AngularJS y filtros ):
Demostración jsFiddle (admite nombres de expresiones y múltiples expresiones)
Es similar a
ui-validate
, pero no necesita una función de validación específica del alcance (esto funciona genéricamente) y, por supuesto, no necesita ui.utils de esta manera.fuente
Actualizar:
Versión mejorada y simplificada de la directiva anterior (una en lugar de dos) con la misma funcionalidad:
Ejemplo de uso:
Resultado: Expresiones de prueba mutuamente dependientes donde los validadores se ejecutan al cambiar el modelo de directiva de otro y el modelo actual.
La expresión de prueba tiene una
$model
variable local que debe usar para compararla con otras variables.Previamente:
Intenté mejorar el código de @Plantface agregando directivas adicionales. Esta directiva adicional es muy útil si nuestra expresión necesita ser ejecutada cuando se realizan cambios en más de una variable ngModel.
Ejemplo de cómo usarlo para hacer campos validados cruzados:
ensure-expression
se ejecuta para validar el modelo cuandong-model
o alguna de lasensure-watch
variables se cambia.fuente
@synergetic Creo que @blesh supone poner la función validar de la siguiente manera
fuente
Validaciones personalizadas que llaman a un servidor
Use la API ngModelController
$asyncValidators
que maneja la validación asincrónica, como hacer una$http
solicitud al backend. Las funciones agregadas al objeto deben devolver una promesa que debe resolverse cuando sea válida o rechazada cuando no sea válida. Las validaciones asíncronas en progreso se almacenan por clavengModelController.$pending
. Para obtener más información, consulte la Guía para desarrolladores de AngularJS - Formularios (validación personalizada) .Para más información, ver
$asyncValidators
API ngModelControllerAngularJS Developer Guide - Formularios (validación personalizada) .
Usando la
$validators
APILa respuesta aceptada usa las tuberías
$parsers
y$formatters
para agregar un validador síncrono personalizado. AngularJS 1.3+ agregó una$validators
API, por lo que no es necesario poner validadores en las tuberías$parsers
y$formatters
:Para obtener más información, consulte AngularJS ngModelController API Reference - $ validators .
fuente
En AngularJS, el mejor lugar para definir la Validación personalizada es la directiva Cutsom. AngularJS proporciona un módulo ngMessages.
Para la validación de formularios personalizados, uno debe usar ngMessages Modules con una directiva personalizada. Aquí tengo una validación simple que verificará si la longitud del número es menor que 6 mostrar un error en la pantalla
Aquí se explica cómo crear una directiva de validación personalizada
$setValidity
es una función incorporada para establecer el estado del modelo en válido / inválidofuente
Extendí la respuesta de @Ben Lesh con la capacidad de especificar si la validación distingue entre mayúsculas y minúsculas o no (predeterminado)
utilizar:
código:
fuente
Algunos ejemplos geniales y libs presentados en este hilo, pero no tenían lo que estaba buscando. Mi enfoque: validez angular : una biblioteca de validación basada en promesas para la validación asincrónica, con un estilo Bootstrap opcional incorporado.
Una solución de validez angular para el caso de uso del OP podría verse así:
Aquí hay un violín , si quieres probarlo. La biblioteca está disponible en GitHub , tiene documentación detallada y muchas demostraciones en vivo.
fuente