Breeze.js & Knockout.js: Das Übersetzen der Breeze-Validierung in die Knockout-Validierung führt zu "Nicht genügend Speicherplatz" oder "Zu viel Rekursion".

Ich habe ein clientseitiges Modell von Breeze / OData erstellt und den Code in verwendetdieser Beitrag um es mit der Knockout-Validierung zu verbinden.

Es eignet sich hervorragend zur Validierung einzelner Felder durch dieisValid() Methode. Allerdings, wenn ich versuche, zu verwendenko.validation.group gegen eine Breeze - Entität (vorausgesetzt, die Knockout - Validierung ist mit konfiguriert){deep: true}), entweder telefonischshowAllMessages, length oder jede andere Methode, die einen Baumdurchlauf über das Objektdiagramm durchführt, führt zur Laufzeit zu einer unendlichen Rekursionsausnahme (sieheknockout.validation.js@231-271). Je nach Browser kann "Out of Stack Space" (IE) oder "Too much Recursion" (Firefox) sein.

Ich denke, die Hauptursache des Fehlers ist, dass der Algorithmus in der Knockout-Validierung die zuvor besuchten Knoten nicht verfolgt. Alle Breeze-Entitäten enthalten eineentityAspect Eigentum und der Code im Innerenknockout.validation Ruft zunächst alle Eigenschaften und alle untergeordneten Elemente mit der Tiefe auf, ohne sich an die bereits besuchten Knoten zu erinnern. Und weilentityAspect Enthält ein Verweis zurück auf seine enthaltende Entität, führt dies zu einem Stapelüberlauf.

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!

Nach alledem lautet die Frage:Kennen Sie eine Möglichkeit, dieses Verhalten zu vermeiden?

Im Moment denke ich, dass ich nur einen dreckig billigen Hack verwenden werdeknockout.validation um zu verhindern, dass man in eineentityAspect Eigentum, aber ich bin sicher, es sollte einen besseren Weg geben.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage