validatedObservable
オブジェクトのコレクションで構成されるビュー モデルを検証しようとすると、予期しない動作が発生します。実際には、ネストされたコレクションです。
まず、動作を示す JSFiddle を紹介します: http://jsfiddle.net/cbono/ZTXB9/8/
私のビューモデルはApp
オブジェクトです。これには、オブジェクトのコレクションである単一のプロパティServicesService
が含まれます。各 Service には、ご想像のとおり、オブジェクトのコレクションであるRetailersRetailer
プロパティが含まれています。各オブジェクトは、validatedObservable としてインスタンス化されるためisValid
、最上位のオブジェクトを呼び出して、子オブジェクトのすべてのエラーを見つけることができます。
ライブラリを初期化するときは、次を使用します。
ko.validation.init({
grouping: {
deep: true,
observable: true
}
});
私が有効にしている唯一の検証ルールは、Retailer オブジェクトに対するものです。小売業者が選択され、小売業者の名前が「その他」( (IsSelected() && IsOther()) === true
) の場合、OtherDescプロパティが必要です。それでおしまい。それ以外の場合、小売業者は有効です。
ルールをテストすると ([その他] チェックボックスの 1 つをオンにして、付随する [説明] フィールドを空白のままにします)、期待どおりに検証が失敗します。ただし、ビュー モデルのerrors
コレクションには次のものが含まれます。
[undefined, undefined, "This field is required"]
self.errors.showAllMessages()
さらに、呼び出されたときに JS コンソールでこのエラーが発生します。
Uncaught TypeError: Object function d(){if(0<arguments.length)
{if(!d.equalityComparer||!d.equalityComparer(c,arguments[0]))d.H(),c=arguments[0],d.G();return this}b.r.Wa(d);return c}
has no method 'isModified'
これら 2 つの問題が関連していることは確かですが、舞台裏で何が起こっているのかをまとめることはできませんでした。検証ライブラリがオブジェクト グラフをウォークしているとき、正しい型ではない (したがってメソッドがない) オブジェクトを取得しているため、エラー コレクションにundefinedIsModified
の束が配置されているようです。
ライブラリを意図したとおりに使用していませんか? モデル検証のアイデアが本当に好きなので、これを機能させるために一生懸命努力しています。jquery.validate などでこの検証を再作成するのは、はるかに複雑です。