es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El formulario Angular Reactivo se envía dos veces y muestra un mensaje de error de inválido después de una envío exitoso.

Tengo un formulario Reactivo de Angular con una validación personalizada de ErrorState. El comportamiento deseado es el siguiente:

  1. Solo mostrar un mensaje de error no válido cuando se ha enviado un campo y no se ha ingresado nada en el campo de entrada de texto.
  2. Si el formulario se ha enviado correctamente, restablecer la validación y el estado de envío a falso y no mostrar el mensaje de error no válido.

Tengo el punto #1 funcionando con el ErrorStateMatcher personalizado. Después de una presentación exitosa, estoy llamando a la función resetForm en FormGroupDirective, que vuelve a configurar el estado de envío en FALSO. El problema es que el formulario parece estar siendo enviado dos veces, por lo que el estado de envío vuelve automáticamente a VERDADERO e inmediatamente muestra el mensaje no válido después de una presentación exitosa.

Un ejemplo de trabajo de este problema se puede encontrar aquí
https://stackblitz.com/edit/add-angular-material-p9btep?devtoolsheight=33&file=src/app/app.component.ts

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución para un Formulario Reactivo de Angular con Validación de Estado de Error Personalizada

    Para lograr el comportamiento deseado para un formulario reactivo de Angular con validación de estado de error personalizada, es necesario seguir los siguientes pasos:

    1. Mostrar solo el mensaje de error inválido cuando se ha enviado un campo y no se ha ingresado nada en el campo de entrada de texto.
      Para hacer esto, puedes utilizar la clase ErrorStateMatcher para mostrar el mensaje de error solamente cuando el campo ha sido tocado y está vacío. Puedes implementar la función de comparación para comprobar el valor del control relacionado y el estado de tocado.
    class MyErrorStateMatcher implements ErrorStateMatcher {
      isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
        const isSubmitted = form && form.submitted;
        return !!(control && control.invalid && (control.touched || isSubmitted) && !control.value);
      }
    }
    

    Luego puedes asignar este comparador de estado de error personalizado a tu control de formulario como se muestra a continuación:

    emailFormControl = new FormControl('', [
      Validators.required,
      Validators.email,
    ]);
    matcher = new MyErrorStateMatcher();
    
    1. Si el formulario se ha enviado correctamente, restablece la validación y el estado de envío a falso y no muestres el mensaje de error.
      Para lograr este comportamiento, puedes crear una función para manejar el envío del formulario con el evento onSubmit() y restablecer la validación del formulario y el estado de envío como se muestra a continuación:
    onSubmit() {
      if (this.contactForm.valid) {
        console.log('formulario enviado correctamente');
        // restablece la validación del formulario y el estado de envío
        this.contactForm.reset();
        this.contactFormDirective.resetForm();
      } else {
        console.log('envío del formulario fallido');
      }
    }
    

    Sin embargo, asegúrate de agregar event.preventDefault() dentro de la función para evitar el comportamiento de envío de formulario predeterminado y evitar que el formulario se envíe dos veces.

    onSubmit(event: Event) {
      event.preventDefault();
    
      if (this.contactForm.valid) {
        console.log('formulario enviado correctamente');
        // restablece la validación del formulario y el estado de envío
        this.contactForm.reset();
        this.contactFormDirective.resetForm();
      } else {
        console.log('envío del formulario fallido');
      }
    }
    

    Con estos cambios, deberías poder lograr el comportamiento deseado para tu formulario reactivo de Angular con validación de estado de error personalizada.

Comments are closed.