Con AngularJS, puedo usar ng-pristine
o ng-dirty
para detectar si el usuario ha ingresado al campo. Sin embargo, quiero hacer la validación del lado del cliente solo después de que el usuario haya abandonado el área de campo. Esto se debe a que cuando un usuario ingresa a un campo como correo electrónico o teléfono, siempre recibirá un error hasta que haya terminado de escribir su correo electrónico completo, y esta no es una experiencia de usuario óptima.
ACTUALIZAR:
Angular ahora se envía con un evento de desenfoque personalizado: https://docs.angularjs.org/api/ng/directive/ngBlur
Respuestas:
Angular 1.3 ahora tiene ng-model-options, y puede configurar la opción,
{ 'updateOn': 'blur'}
por ejemplo, e incluso puede eliminar el rebote, cuando el uso es escribir demasiado rápido o si desea guardar algunas operaciones DOM costosas (como escribir un modelo a varios lugares DOM y no desea que ocurra un ciclo de $ digest con cada tecla presionada)https://docs.angularjs.org/guide/forms#custom-triggers y https://docs.angularjs.org/guide/forms#non-immediate-debounced-model-updates
Y rebotar
fuente
ng-change
eventos antes de que el usuario abandone el campo. Por ejemplo, en mi caso, solicito nuevos datos de mi API tan pronto como el campo de entrada sea válido, pero no quiero mostrar un mensaje de error tan pronto como sea inválido; solo quiero hacer esto cuando es inválido y ocurrió el evento de desenfoque.1.3.0 rc-3
y no se disparachange
hasta queblur
, verifique esto: plnkr.co/edit/RivVU3r7xfHO1hUybqMu?p=previewA partir de la versión 1.3.0, esto se puede hacer fácilmente
$touched
, lo cual es cierto después de que el usuario haya abandonado el campo.https://docs.angularjs.org/api/ng/type/ngModel.NgModelController
fuente
updateOn: 'default'
que significa, para entradas, tecla arriba y para selecciones, al cambiarResolví esto ampliando lo que sugirió @jlmcdonald. Creé una directiva que se aplicaría automáticamente a todos los elementos de entrada y selección:
Esto agregará
has-focus
yhas-visited
clases a varios elementos a medida que el usuario se enfoca / visita los elementos. Luego puede agregar estas clases a sus reglas CSS para mostrar errores de validación:Esto funciona bien en el sentido de que los elementos aún obtienen $ propiedades no válidas, etc., pero el CSS se puede usar para brindar al usuario una mejor experiencia.
fuente
formName.inputName.$dirty
. Sugeriría editar la directiva para escribir un booleano similarformName.inputName.$focused
, en lugar de usar nombres de clase para desenfoque y booleanos para validación.Me las arreglé para hacer esto con un poco de CSS bastante simple. Esto requiere que los mensajes de error sean hermanos de la entrada con la que se relacionan y que tengan una clase de
error
.Después de cumplir con esos dos requisitos, esto ocultará cualquier mensaje de error relacionado con un campo de entrada enfocado, algo que creo que angularjs debería estar haciendo de todos modos. Parece un descuido.
fuente
Esto parece estar implementado como estándar en las versiones más nuevas de angular.
Las clases ng-untouched y ng-touch se establecen respectivamente antes y después de que el usuario se haya centrado en un elemento validado.
CSS
fuente
Con respecto a la solución de @ lambinator ... recibí el siguiente error en angular.js 1.2.4:
No estoy seguro de si hice algo mal o si se trata de un cambio en Angular, pero la eliminación de las
scope.$apply
declaraciones resolvió el problema y las clases / estados aún se actualizan.Si también está viendo este error, pruebe lo siguiente:
fuente
Podría funcionar para usted escribir una directiva personalizada que envuelva el método javascript blur () (y ejecute una función de validación cuando se active); hay un problema de Angular que tiene un ejemplo (así como una directiva genérica que puede vincularse a otros eventos que no son compatibles de forma nativa con Angular):
https://github.com/angular/angular.js/issues/1277
Si no desea seguir esa ruta, su otra opción sería configurar $ watch en el campo, activando nuevamente la validación cuando el campo se completa.
fuente
Para profundizar más en las respuestas dadas, puede simplificar el etiquetado de entrada utilizando pseudoclases CSS3 y solo marcando los campos visitados con una clase para retrasar la visualización de los errores de validación hasta que el usuario pierda el enfoque en el campo:
(El ejemplo requiere jQuery)
JavaScript
CSS
HTML
fuente
basado en la respuesta de @nicolas .. CSS puro debería ser el truco, solo mostrará el mensaje de error en el desenfoque
CSS
fuente
Aquí hay un ejemplo que usa ng-messages (disponible en angular 1.3) y una directiva personalizada.
El mensaje de validación se muestra en desenfoque la primera vez que el usuario abandona el campo de entrada, pero cuando corrige el valor, el mensaje de validación se elimina inmediatamente (ya no en desenfoque).
JavaScript
HTML
PD. No olvide descargar e incluir ngMessages en su módulo:
fuente
ng-model-options en AngularJS 1.3 (beta al momento de escribir este artículo) está documentado para admitir {updateOn: 'blur'}. Para versiones anteriores, algo como lo siguiente funcionó para mí:
Con una plantilla como esta:
fuente
Usar estado del campo $ tocado El campo se ha tocado para esto como se muestra en el siguiente ejemplo.
fuente
Puede configurar dinámicamente la clase css has-error (asumiendo que está usando bootstrap) usando ng-class y una propiedad en el alcance del controlador asociado:
plunkr: http://plnkr.co/edit/HYDlaTNThZE02VqXrUCH?p=info
HTML:
Controlador:
fuente
Si usa bootstrap 3 y lesscss, puede habilitar la validación de desenfoque con el siguiente fragmento menos:
fuente
outUsé una directiva. Aquí está el código:
Todo mi control de entrada tiene un elemento de intervalo como elemento siguiente, que es donde se muestra mi mensaje de validación y, por lo tanto, la directiva como atributo se agrega a cada control de entrada.
También tengo (opcional) .has-focus y la clase css visitada en mi archivo css al que se hace referencia en la directiva.
NOTA: recuerde agregar 'on-blur-val' exactamente de esta manera a su control de entrada sin los apóstrofos
fuente
Al usar ng-focus , puede lograr su objetivo. debe proporcionar ng-focus en su campo de entrada. Y mientras escribe sus derivadas ng-show, también debe escribir una lógica que no sea igual. Como el siguiente código:
<input type="text" class="form-control" name="inputPhone" ng-model="demo.phoneNumber" required ng-focus> <div ng-show="demoForm.inputPhone.$dirty && demoForm.inputPhone.$invalid && !demoForm.inputPhone.$focused"></div>
fuente
Podemos usar las funciones onfocus y onblur. Sería mejor y más sencillo.
Intenta aquí:
http://plnkr.co/edit/NKCmyru3knQiShFZ96tp?p=preview
fuente