Little known fact:
There can be multiple directives with the same name. Each one does not overwrite the previous, but rather gets applied along-side all the others.
The simplest way to achieve what you want is to define a custom directive for form elements (you will in fact need two: one for form and one for ngForm) that gets access to the FormController instance and augments it with custom behaviour.
E.g.:
app.directive('form', function () {
return {
restrict: 'E',
require: 'form', // to get access to the FormController instance
link: function postLink(scope, elem, attrs, formCtrl) {
formCtrl.submit = function () {
alert(formCtrl.$valid ? '*Submit*' : '*Error*');
};
}
};
});
See, also, this short demo.