1
resposta

Validar registro vindo do banco

Bom dia Observei que tem varias validações de formulário porem não achei nada ensinando validar dados que ver de um registro, ou seja, antes da cadastrar, ele validar se esse nome, cpf, etç ja existe. Tem como faze isso de forma reativa? Grato

Achei algo assim porem so tem aopção de usar messagem . Tem como fazer de outra forma? Outro Modulo não consegui usar o <app-mensagem *ngIf="novoUsuarioForm.get('userName')?.errors?.usuarioExistente" message="Usuário existente!" > https://cursos.alura.com.br/forum/topico-erro-para-exibir-mensagem-de-usuario-ja-existente-243595

1 resposta

E aí, Emerson!

Se você quer explorar outras opções sem usar a mensagem diretamente no template, você pode considerar usar um serviço para lidar com as validações assincronamente.

Você pode criar um serviço que faz a verificação no backend e retorna um Observable com a resposta. Depois, você pode usar operadores como debounceTime para evitar muitas requisições em tempo real e switchMap para garantir que apenas a resposta mais recente seja considerada.

No seu componente, você pode se inscrever nesse Observable e atualizar o estado do formulário com base na resposta do servidor.

Algo assim no seu serviço:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class ValidacaoService {
  constructor(private http: HttpClient) {}

  verificarExistenciaUsuario(userName: string): Observable<boolean> {
    return this.http.get<boolean>(`/api/verificarUsuario/${userName}`).pipe(
      map(response => response)
    );
  }
}

E no seu componente:

import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ValidacaoService } from 'caminho-do-seu-servico';

@Component({
  selector: 'app-seu-componente',
  templateUrl: './seu-componente.component.html',
  styleUrls: ['./seu-componente.component.css']
})
export class SeuComponente {
  novoUsuarioForm: FormGroup;

  constructor(private fb: FormBuilder, private validacaoService: ValidacaoService) {
    this.novoUsuarioForm = this.fb.group({
      userName: ['', Validators.required],
      // ... outros campos do formulário
    });

    this.novoUsuarioForm.get('userName').valueChanges
      .pipe(
        debounceTime(300),
        switchMap(userName => this.validacaoService.verificarExistenciaUsuario(userName))
      )
      .subscribe(usuarioExistente => {
        if (usuarioExistente) {
          this.novoUsuarioForm.get('userName').setErrors({ usuarioExistente: true });
        } else {
          this.novoUsuarioForm.get('userName').setErrors(null);
        }
      });
  }
}

Lembre de adaptar isso ao seu backend e às suas necessidades específicas. E sempre teste bem para garantir que tudo está funcionando como esperado.