Breeze.js & Knockout.js: перевод проверки Breeze в проверку нокаута приводит к «Out of stack space» или «Too much recursion»
У меня есть модель на стороне клиента, сгенерированная Breeze / OData, и я использовал код вэта почта подключить его к валидации нокаута.
Это прекрасно работает для проверки отдельных полей черезisValid()
метод. Однако всякий раз, когда я пытаюсь использоватьko.validation.group
против Breeze Entity (предположим, что проверка выбивания настроена с{deep: true}
), либо звоню,showAllMessages
length
или любой другой метод, который выполняет обход дерева над графом объектов, приводит к исключению бесконечной рекурсии во время выполнения (см.knockout.validation.js@231-271
). В зависимости от браузера можноOut of stack space " (IE) или "Слишком много рекурсии (Fire Fox).
Я думаю, что основная причина ошибки заключается в том, что алгоритм внутри Knockout Validation не отслеживает ранее посещенные узлы. Все Бриз Сущности содержатentityAspect
свойство и код внутриknockout.validation
сначала посещает все свойства и все их дочерние объекты, используя глубину, но без запоминания уже посещенных узлов. И потому чтоentityAspect
содержит ссылку обратно на содержащую его сущность, это приводит к переполнению стека.
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!
Итак, после всего этого возникает вопрос:знаете ли вы какие-нибудь обходные пути, чтобы избежать такого поведения?
Сейчас я думаю, чтоЯ просто собираюсь использовать грязный дешевый хак внутриknockout.validation
чтобы не попасть вentityAspect
собственность, но яЯ уверен, что должен быть лучший способ.