我有一个由 Breeze/OData 生成的客户端模型,我使用本文中的代码将其连接到 Knockout 验证。
它非常适合通过该isValid()
方法验证单个字段。但是,每当我尝试ko.validation.group
对 Breeze 实体使用(假设淘汰验证配置为)时,{deep: true}
调用或任何其他对对象图执行树遍历的方法都会在运行时导致无限递归异常(请参阅) . 取决于浏览器可以是“堆栈空间不足”(IE)或“递归过多”(Firefox)。showAllMessages
length
knockout.validation.js@231-271
我认为错误的根本原因是 Knockout Validation 中的算法没有跟踪以前访问过的节点。所有 Breeze 实体都包含一个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
房产,但我相信应该有更好的方法。