Angular-Loiane-Training

Este repositorio contem exemplos documentados e descricoes dos conteudos estudados ao longo do curso de Angular da Loiane

View project on GitHub

Validacao Customizada

Para implementar validacoes personalizadas e possivel declarar metodos que contem em sua assinatura um parametro do tipo FormControl (deste modo o angular identifica e injeta o control automaticamente ao receber este validator como valor no array declarado para o respectivo campo no metodo group da classe FormBuilder). Para este exemplo sera aplicada uma validacao customizada ao campo cep. note que neste caso nao contemos parametros alem do proprio FormControl, vide Validacao Customizada em FormArray para declarar metodos que podem receber parametros de validacao.

o metodo declarado e validarCep que recebe um parametro do tipo FormControl, no interior do metodo contem a logica para validar se o valor e valido ou nao, retornando objeto contendo o erro, caso invalido, e possivel passar o valor true para a chave com o nome do erro (neste caso cepInvalido) ou uma mensagem.

public validarCep(formControl: FormControl) {
    const cep = formControl.value;
    if(cep && cep !== '') {
      const regexCep = /^[0-9]{8}$/;
      return regexCep.test(cep) ? null : {cepInvalido: 'O cep nao e valido' }
    }
    return null;
  }

no array que espera receber os validators, basta, incluir a validacao customizada ao array.

is.formulario = this.formBuilder.group({
nome: [null, Validators.required],
email: [null, [Validators.required, Validators.email]],
endereco: this.formBuilder.group({
  // validator customizado adicionado aos validators do formControl.
  // note que nao e necessario passar o `FormControl` como argumento,
  // pois o angular entende e injeta-o como argumento automaticamente
  cep: [null, [Validators.required, this.validarCep]],
  numero: [null, Validators.required],
  rua: [null, Validators.required],
  complemento: null,
  bairro: [null, Validators.required],
  cidade: [null, Validators.required],
  estado: [null, Validators.required]
}),
tecnologias: null,
newsLetter: null,
termos: [null, Validators.pattern('true')],
frameworks: this.buildFormArray()
    })

Deste modo ao digitar um cep que nao esteja valido o atributo errors dentro do control ira conter o erro retornado.


objetos contendo erros no FormControl de cep.

Exibindo erros personalizados.

as mensagens no interior de errors podem ser capturadas para exibicao ao usuario ou tratativa em outros algoritmos, note que neste exemplo iremos utilizar o um component para exibir a mensagem de erro, e utilizando o metodo hasError da propria classe FormControl verificamos se a div que contem o erro deve ou nao ser exibida.

<div class="col-md-3" [ngClass]="aplicaCssErro('endereco.cep')">
  <label for="cep" class="control-label">Cep</label>
  <input type="text" class="form-control" id="cep" formControlName="cep" (blur)="consultaCep()" />
  <app-campo-erro [mostrarErro]="verificaValidAndTouched('endereco.cep')"
    mensagemErro="O campo cep e obrigatorio">
  </app-campo-erro>
  <app-campo-erro [mostrarErro]="this.formulario.get('endereco.cep')?.hasError('cepInvalido')"
    [mensagemErro]="this.formulario.get('endereco.cep')?.errors?.cepInvalido">
  </app-campo-erro>
</div>


validacao customizada no campo cep.