2
respostas

As validações sumiram

Não sei o que fiz de errado, para fixação eu acompanho o curso, paro e repito os passos do professor, porém... Depois da aula de vaidações assincronas minhas validações sumiram da pagina de cadastro do novo usuario. Realmente não sei onde errei... #frustradoestou rs Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui meu código do novo-usuario.component.ts;

import { UsuarioExisteService } from './usuario-existe.service';
import { NovoUsuarioService } from './novo-usuario.service';
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { NovoUsuario } from './novo-usuario';
import { minusculoValidator } from './minuscula.validator';

@Component({
  selector: 'app-novo-usuario',
  templateUrl: './novo-usuario.component.html',
  styleUrls: ['./novo-usuario.component.css']
})
export class NovoUsuarioComponent implements OnInit {

  novoUsuarioForm!: FormGroup;
  router: any;

  constructor(
    private formBuilder: FormBuilder,
    private novoUsuarioService: NovoUsuarioService,
    private usuarioExisteService:   UsuarioExisteService) { }

  ngOnInit(): void {
    this.novoUsuarioForm = this.formBuilder.group({
      email: ['', Validators.required, Validators.email],
      fullName: ['', Validators.required, Validators.minLength(4)],
      userName: [
        '',
        [minusculoValidator],
        [this.usuarioExisteService.usuarioJaExiste()]
      ],
      password: [''],
    })
  }
  cadastrar() {
    if (this.novoUsuarioForm.valid) {
      const novoUsuario = this.novoUsuarioForm.getRawValue() as NovoUsuario;
      this.novoUsuarioService.cadastraNovoUsuario(novoUsuario).subscribe(
        () => {
          this.router.navigate(['']);
        },
        (error) => {
          console.log(error);
        }
      );
    }
  }
}

e o componente html;

<h4 class="text-center">Registre-se e mostre seu pet ao mundo!</h4>

<form class="form mt-4" [formGroup]="novoUsuarioForm" (submit)="cadastrar()">
  <div class="form-group">
    <input placeholder="e-mail" class="form-control" formControlName="email" />
    <app-mensagem
      *ngIf="
        novoUsuarioForm.get('email')?.errors?.required &&
        novoUsuarioForm.get('email')?.touched
      "
      mensagem="E-mail obrigatório"
    >
    </app-mensagem>
    <app-mensagem
      *ngIf="
        novoUsuarioForm.get('email')?.errors?.email &&
        novoUsuarioForm.get('email')?.touched
      "
      mensagem="E-mail no formato incorreto"
    >
    </app-mensagem>
  </div>
  <div class="form-group">
    <input
      placeholder="Nome Completo"
      class="form-control"
      formControlName="fullName"
    />
    <app-mensagem
      *ngIf="
        novoUsuarioForm.get('fullName')?.errors &&
        novoUsuarioForm.get('fullName')?.touched
      "
      mensagem="Nome incorreto"
    >
    </app-mensagem>
  </div>
  <div class="form-group">
    <input
      placeholder="Usuário"
      class="form-control"
      formControlName="userName"
    />
    <app-mensagem
      *ngIf="
        novoUsuarioForm.get('userName')?.errors?.minusculo &&
        novoUsuarioForm.get('userName')?.touched
      "
      mensagem="Usuário deve ser em letra minúscula"
    >
    </app-mensagem>
    <app-mensagem
      *ngIf="novoUsuarioForm.get('userName')?.errors?.usuarioExistente"
      mensagem="Este usuário já existe"
    ></app-mensagem>
  </div>
  <div class="form-group">
    <input
      type="password"
      placeholder="Senha"
      class="form-control"
      formControlName="password"
    />
    <app-mensagem
      *ngIf="novoUsuarioForm.errors?.senhaIgualUsuario"
      mensagem="Senha deve ser diferente do usuário"
    >
    </app-mensagem>
  </div>

  <button class="btn btn-primary btn-block">Cadastro</button>
</form>

<p>Já é um usuário? <a [routerLink]="['']"> Faça Login</a></p>

Ajudem-me please

2 respostas

Fala Fabio, tudo bom?

Fica assim não, essas coisas acontecem. Notei que você criou o propriedade router: any, mas acredito que a ideia seria de fazer a injeção do Router. Isso é feito no constructor da classe, como você fez com os serviços e com FormBuilder.

  constructor(
    private formBuilder: FormBuilder,
    private novoUsuarioService: NovoUsuarioService,
    private usuarioExisteService: UsuarioExisteService,
    private router: Router
  ) {}

Na aula de validação assíncrona, o Alvaro cria um serviço que verifica se o usuário existe. O erro pode está nesse serviço. Mas nessa no código que compartilhou não encontrei erro. Poderia compartilha o serviço de UsuarioExisteService para poder investigar melhor?

Aguardo, Fabio. Bons estudos.

Olá Fabio, tudo bem?

Quando você está construindo o formulário no arquivo novo-usuario.component.ts, o segundo parâmetro que o campo pode receber é um array com as validações. Faltou você inserir os colchetes ao redor dos validators, assim:

ngOnInit(): void {
    this.novoUsuarioForm = this.formBuilder.group({
      email: ['', [Validators.required, Validators.email]],
      fullName: ['', [Validators.required, Validators.minLength(4)]],
      userName: [
        '',
        [minusculoValidator],
        [this.usuarioExisteService.usuarioJaExiste()]
      ],
      password: [''],
    })
  }

Pode ser esse o motivo do erro, mas se não for, continuamos à disposição para descobrir o que há de errado!

Neste artigo sobre validação em formulários reativos no Angular você pode encontrar mais informações sobre o assunto!

Bons estudos!