Breeze.js & Knockout.js: a tradução da validação da brisa para a validação do knockout causa um 'espaço em pilha' ou 'muita recursão'
Eu tenho um modelo do lado do cliente gerado pelo Breeze / OData e usei o código emesta postagem para conectá-lo à validação do Knockout.
Funciona muito bem para validar campos individuais através doisValid()
método. No entanto, sempre que tento usarko.validation.group
contra uma Entidade Breeze (suponha que a validação de knockout esteja configurada{deep: true}
), quer chamandoshowAllMessages
, length
ou qualquer outro método que execute uma travessia de árvore sobre o gráfico de objetos, resulta em uma exceção de recursão infinita em tempo de execuçãoknockout.validation.js@231-271
). Dependendo do navegador pode ser "Out of stack space" (IE) ou "Too much recursion" (Firefox).
Eu acho que a causa raiz do erro é que o algoritmo dentro do Knockout Validation não controla os nós visitados anteriormente. Todas as Entidades Breeze contêm umentityAspect
propriedade e o código dentroknockout.validation
visita todas as propriedades e todos os seus filhos usando profundidade primeiro, mas sem lembrar os nós já visitados. E porqueentityAspect
contém uma referência de volta à sua entidade contida, isso resulta em um estouro de pilha.
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!
Então, depois de tudo isso, a questão é:Você conhece algum trabalho para evitar esse comportamento?
Por enquanto, acho que vou usar um hack barato e sujo por dentroknockout.validation
para evitar entrar em umentityAspect
propriedade, mas tenho certeza que deve haver uma maneira melhor.