0

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 などでこの検証を再作成するのは、はるかに複雑です。

4

1 に答える 1

2

validatedObservable はネストできないようです。App だけを validatedObservable のままにしておくと、問題が解決します。

self.Services = ko.observableArray(
ko.utils.arrayMap(data, function (svc) {
    return new Service(svc); // unwrap
}));

//....

self.Retailers = ko.observableArray(
ko.utils.arrayMap(data.retailers, function (rtl) {
    return new Retailer(rtl); // unwrap
}));

http://jsfiddle.net/ostgals/ZTXB9/16/

于 2013-02-12T19:26:20.283 に答える