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.

questionAnswers(0)

yourAnswerToTheQuestion