knockout.js breeze knockout-validation

Breeze.js & Knockout.js: la traducción de la validación de breeze a la validación de knockout provoca un "espacio fuera de pila" o "demasiada recursión"



knockout-validation (0)

Tengo un modelo del lado del cliente generado por Breeze / OData y utilicé el código en esta publicación para conectarlo a la validación Knockout.

Funciona muy bien para validar campos individuales a través del método isValid() . Sin embargo, cada vez que trato de usar ko.validation.group contra una Entidad Breeze (supongamos que la validación knockout está configurada con {deep: true} ), ya sea llamando a showAllMessages , length o cualquier otro método que realice un recorrido de árbol sobre el gráfico objeto , resulta en una excepción de recursión infinita en tiempo de ejecución (ver knockout.validation.js@231-271 ). Dependiendo del navegador puede ser "Fuera de espacio de pila" (IE) o "Demasiada recursividad" (Firefox).

Creo que la causa raíz del error es que el algoritmo dentro de la validación Knockout no hace un seguimiento de los nodos previamente visitados. Todas las Entidades Breeze contienen una propiedad entityAspect y el código dentro de knockout.validation visita todas las propiedades y todos sus hijos utilizando primero la profundidad, pero sin recordar los nodos ya visitados. Y debido a que entityAspect contiene una referencia de regreso a su entidad que lo contiene, resulta en un desbordamiento de la pila.

validate(entity) // Initial call => validate(entity.entityAspect) // Validate the first property of the root => validate(entity.entityAspect.entity) // Validate the first property of the child, which points back to the root!

Entonces, después de todo esto, la pregunta es: ¿conocen alguna forma de evitar este comportamiento?

Por ahora, creo que voy a utilizar un truco barato y sucio dentro de la entityAspect knockout.validation evitar entrar en una propiedad de entityAspect , pero estoy seguro de que debería haber una mejor manera.