1

Breeze/OData によって生成されたクライアント側モデルがあり、この投稿のコードを使用して、それを Knockout 検証に接続しました。

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

4

0 に答える 0