Un enfoque es forzar a que todos los atributos estén sucios. Puedes hacer eso en cada controlador, pero se vuelve muy complicado. Sería mejor tener una solución general.
La forma más fácil que se me ocurrió fue utilizar una directiva
- manejará el atributo de envío de formulario
- itera a través de todos los campos de formulario y marca los campos prístinos como sucios
- comprueba si el formulario es válido antes de llamar a la función de envío
Aquí está 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 actualice su formulario html, por ejemplo:
<form ng-submit='justDoIt()'>
se convierte en:
<form name='myForm' novalidate submit='justDoIt()'>
Vea un ejemplo completo aquí: http://plunker.co/edit/QVbisEK2WEbORTAWL7Gu?p=preview