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.