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 eventothis.projectForm.controls['phases'].valueChanges
y los bucles infinitos.Podrías ponerte
emitEvent
opción afalse
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 operadorvalueChanges
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