Breeze.js & Knockout.js: przetłumaczenie sprawdzania poprawności bryzy na walidację eliminuje przyczynę braku miejsca na stosie lub zbyt dużej rekurencji
Mam model po stronie klienta wygenerowany przez Breeze / OData i użyłem kodu wten post podłączyć go do walidacji Knockout.
Świetnie sprawdza się podczas walidacji poszczególnych pól za pomocąisValid()
metoda. Jednak zawsze, gdy próbuję użyćko.validation.group
przeciwko Breeze Entity (załóżmy, że walidacja nokautu jest skonfigurowana za pomocą{deep: true}
), albo dzwoniącshowAllMessages
, length
lub dowolna inna metoda, która wykonuje przejście drzewa nad wykresem obiektu, powoduje nieskończony wyjątek rekurencji w czasie wykonywania (patrzknockout.validation.js@231-271
). W zależności od przeglądarki może to być „Przestrzeń poza stosem” (IE) lub „Zbyt duża rekursja” (Firefox).
Myślę, że podstawową przyczyną błędu jest to, że algorytm w walidacji Knockout nie śledzi wcześniej odwiedzanych węzłów. Wszystkie jednostki bryzy zawierająentityAspect
własność i kod wewnątrzknockout.validation
najpierw odwiedza wszystkie właściwości i wszystkie jego dzieci, ale nie pamięta węzłów już odwiedzonych. I ponieważentityAspect
zawiera odwołanie do swojej encji zawierającej, co powoduje przepełnienie stosu.
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!
Po tym wszystkim pytanie brzmi:Czy znasz jakieś obejście, aby uniknąć tego zachowania?
Na razie myślę, że użyję brudnego, taniego włazu w środkuknockout.validation
aby zapobiec wkroczeniuentityAspect
nieruchomości, ale jestem pewien, że powinien być lepszy sposób.