Breeze.js & Knockout.js: перевод проверки Breeze в проверку нокаута приводит к «Out of stack space» или «Too much recursion»

У меня есть модель на стороне клиента, сгенерированная Breeze / OData, и я использовал код вэта почта подключить его к валидации нокаута.

Это прекрасно работает для проверки отдельных полей черезisValid() метод. Однако всякий раз, когда я пытаюсь использоватьko.validation.group против Breeze Entity (предположим, что проверка выбивания настроена с{deep: true}), либо звоню,showAllMessageslength или любой другой метод, который выполняет обход дерева над графом объектов, приводит к исключению бесконечной рекурсии во время выполнения (см.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 собственность, но яЯ уверен, что должен быть лучший способ.

Ответы на вопрос(0)

Ваш ответ на вопрос