2
respostas

Segue código atual que funciona baseado na documentação

import { NovoUsuarioService } from './novo-usuario.service'; import { Injectable } from '@angular/core'; import { AbstractControl, AsyncValidator, ValidationErrors } from '@angular/forms'; import { first, map, switchMap, Observable } from 'rxjs';

@Injectable({ providedIn: 'root' }) export class UsuarioExisteService implements AsyncValidator {

constructor(private novoUsuarioService: NovoUsuarioService) { }

validate( control: AbstractControl ) : Observable<ValidationErrors | null> { return control.valueChanges.pipe( switchMap((username) => //prepara os dados da string digitada para o envio ao serviço this.novoUsuarioService.verificaSeUsuarioJaExiste(username) ), map((usuarioJaExiste) => //processa o resultado do serviço usuarioJaExiste ? { usuarioExistente: true } : null ), first() ); }

}

https://angular.io/guide/form-validation#reactive-component-class

this.novoUsuarioForm = this.formBuilder.group({ email: ['', [Validators.required, Validators.email]], fullName: ['', [Validators.required, Validators.minLength(4)]], userName: ['', [Validators.required, minusculoValidator], [this.usuarioExistenteService.validate.bind(this.usuarioExistenteService)]], password: ['', [Validators.required]] })

2 respostas

Tentei fazer isso para ver se corrigia o problema que muitos estão questionando sobre o pipe, mas mesmo assim não funcionou. O problema ainda está sem solução.

ERROR TypeError: Cannot read properties of undefined (reading 'pipe')
    at usuario-existe.service.ts:15:35
    at forms.js:1190:1
    at Array.map (<anonymous>)
    at executeValidators (forms.js:1190:1)
    at FormControl._composedAsyncValidatorFn (forms.js:1165:1)
    at FormControl._runAsyncValidator (forms.js:3057:1)
    at FormControl.updateValueAndValidity (forms.js:3031:1)
    at new FormControl (forms.js:3388:1)
    at FormBuilder.control (forms.js:6731:1)
    at FormBuilder._createControl (forms.js:6769:1)