O pulo do gato é bem descrito por Ben Lesh, utilizando a função $setValidity pertencente ao ngModelController definimos se o valor de um ngModel de determinado campo é válido ou não. Vale à pena conhecer a documentação de ngModelController.
Vamos ao código:
dir.directive("cpfValidate", function(){
return{
// iremos utilizar a diretiva como atributo
restrict: 'A',
// o elemento a ser validado deve conter o atributo ng-model
require: 'ngModel',
link: function(scope, elem, attr, ctrl) {
/*
$parser é um array de funções para sanitizar os dados,
aqui eu adiciono a minha função de validação.
*/
ctrl.$parsers.unshift(function(value) {
/*
TestaCPF é uma função qualquer para testar um cpf
você pode implementar a sua ou copiar na internet.
*/
var valid = TestaCPF(value);
ctrl.$setValidity('cpfValidate', valid);
// se for válido retorno valid, else retorna undefined.
return valid ? value : undefined;
});
}
};
});