Estoy usando este método: http://plnkr.co/edit/A6gvyoXbBd2kfToPmiiA?p=preview para validar sólo los campos en el desenfoque. Esto funciona bien, pero también me gustaría validarlos (y por lo tanto mostrar los errores para esos campos, si los hay) cuando el usuario hace clic en el botón 'submit' (no un envío real, sino una llamada de datos-ng-clic a una función)
¿Hay alguna forma de activar la validación de todos los campos de nuevo al hacer clic en ese botón?
Pues bien, la forma angular sería dejar que se encargue de la validación, -ya que lo hace en cada cambio de modelo- y sólo mostrar el resultado al usuario, cuando tú quieras.
En este caso tu decides cuando mostrar los errores, solo tienes que poner un flag: http://plnkr.co/edit/0NNCpQKhbLTYMZaxMQ9l?p=preview
Por lo que sé hay un tema archivado en angular para permitirnos tener un control más avanzado del formulario. Ya que no está resuelto yo usaría esto en lugar de reinventar todos los métodos de validación existentes.
edit: Pero si insistes en tu camino, aquí está tu fiddle modificado con la validación antes del submit. http://plnkr.co/edit/Xfr7X6JXPhY9lFL3hnOw?p=preview El controlador emite un evento cuando se pulsa el botón, y la directiva hace la magia de la validación.
Un enfoque es forzar que todos los atributos estén sucios. Se puede hacer eso en cada controlador, pero se vuelve muy desordenado. Sería mejor tener una solución general.
La forma más fácil que se me ocurrió fue utilizar una directiva
Esta es la directiva
myModule.directive('submit', function() {
return {
restrict: 'A',
link: function(scope, formElement, attrs) {
var form;
form = scope[attrs.name];
return formElement.bind('submit', function() {
angular.forEach(form, function(field, name) {
if (typeof name === 'string' && !name.match('^[\$]')) {
if (field.$pristine) {
return field.$setViewValue(field.$value);
}
}
});
if (form.$valid) {
return scope.$apply(attrs.submit);
}
});
}
};
});
Y actualiza el html de tu formulario, por ejemplo:
<form ng-submit='justDoIt()'>
se convierte:
<form name='myForm' novalidate submit='justDoIt()'>
Vea un ejemplo completo aquí: http://plunker.co/edit/QVbisEK2WEbORTAWL7Gu?p=preview
Me gusta el este enfoque en el manejo de la validación al hacer clic en el botón.
No hay necesidad de invocar nada desde el controlador,
todo se maneja con una directiva.
en github