Breeze/OData によって生成されたクライアント側モデルがあり、この投稿のコードを使用して、それを Knockout 検証に接続しました。
isValid()
メソッドを介して個々のフィールドを検証するのに最適です。ただし、ko.validation.group
Breeze エンティティに対して使用しようとすると (ノックアウト検証が で構成されていると仮定します{deep: true}
)、 を呼び出すか、オブジェクト グラフに対してツリー トラバーサルを実行するその他のメソッドを呼び出すと、実行時に無限再帰例外が発生します ( を参照showAllMessages
) 。 . ブラウザによっては、「スタック領域不足」(IE) または「再帰が多すぎる」(Firefox) になる場合があります。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
が、もっと良い方法があるはずです.