Forma reactiva angular, valor Los cambios se ejecutan en "tamaño máximo de llamada"

Estoy tratando de cambiar mis valores de formaray basados en el índice tan pronto como ocurra un cambio en la forma. Se da la siguiente situación: He dado fases cada una con una fecha de inicio y final. Excepto en la primera fase, la fecha de inicio de una fase debe ser siempre la misma que la fecha final de la fase anterior.

Creo que el error ocurre porque el valorCambios siempre se llama como el valor de la forma se cambia al final del método.

  onChanges() {
this.projectForm.controls['phases'].valueChanges.subscribe(value => {
  for (var i = 1; i <= this.phasecount; i++) {
      this.projectPhases.at(i).patchValue({ pStart: value[i - 1].pEnd });                   
  }
})

}

¿Alguno de ustedes tiene una idea de cómo trabajar alrededor del error (tal vez una condición de terminación)?

Gracias por adelantado.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por logicloom


3 Respuestas:

  • Esta línea this.projectPhases.at(i).patchValue({ pStart: value[i - 1].pEnd }); desencadena este evento this.projectForm.controls['phases'].valueChanges y los bucles infinitos.

    Podrías ponerte emitEvent opción a false mientras hacía parche Valor :

    this.projectPhases.at(i)
    .patchValue({ pStart: value[i - 1].pEnd }, { emitEvent: false });
    

    Respondida el Dec 18, 2020 a las 10:57 - por algorithmarchitect

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando puede estar relacionado con el hecho de que al cambiar los valores de la forma basados en el índice, el ciclo for que estás utilizando se ejecuta hasta el tamaño máximo de la llamada, lo cual puede causar que se trate de acceder a índices inexistentes en tu arreglo.

    Para evitar este error, una posible solución es comprobar si el índice actual es mayor o igual a la longitud de tu arreglo antes de intentar acceder a ese índice. Puedes modificar tu código de la siguiente manera:

    typescript
    onChanges() {
      this.projectForm.controls['phases'].valueChanges.subscribe(value => {
        for (var i = 1; i < this.phasecount; i++) {
          if (i < value.length) {
            this.projectPhases.at(i).patchValue({ pStart: value[i - 1].pEnd });                   
          }                
        }
      });
    }
    

    Al agregar la condición if (i < value.length), te aseguras de que solo intentas acceder a un índice en tu arreglo si dicho índice realmente existe. Esto puede prevenir el error causado por un índice fuera del rango válido.

    Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 19, 2020 a las 10:59 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando en Angular probablemente se deba a que estás intentando actualizar los valores del formulario reactivo dentro del mismo ciclo de cambio de valor. Esto puede provocar un bucle infinito, ya que Angular detectará los cambios y volverá a ejecutar el mismo código.

    Para resolver este problema, puedes utilizar la función debounceTime del operador valueChanges para retrasar la ejecución del código hasta que el valor del formulario haya dejado de cambiar durante un periodo de tiempo específico.

    Aquí tienes un ejemplo modificado de tu código que debería funcionar:

    typescript
    onChanges() {
      this.projectForm.controls['phases'].valueChanges.pipe(
        debounceTime(100) // Retrasa la ejecución durante 100 milisegundos
      ).subscribe(value => {
        for (var i = 1; i <= this.phasecount; i++) {
          this.projectPhases.at(i).patchValue({ pStart: value[i - 1].pEnd });
        }
      })
    }
    

    Al añadir debounceTime, estás introduciendo un retraso de 100 milisegundos antes de ejecutar el código. Esto da tiempo a Angular para procesar el cambio de valor y evitar que se ejecute el código dentro del mismo ciclo de cambio de valor.

    Puedes ajustar el valor de debounceTime según sea necesario para satisfacer los requisitos específicos de tu aplicación.

    Respondida el Dec 19, 2020 a las 11:08 - por Gemini

    Votos positivos: 0 | Votos negativos: 0