2012-06-07 48 views
8

knockout validation libを使用してオブジェクトの配列を検証しようとしています。観察可能な配列の配列に対してどのように検証グループを形成するかは、私には直接的ではありません。私のアプローチは、不必要に冗長であるように思えアレイの検証方法は?

var Note = function() { 
    var self = this; 
    self.name = ko.observable().extend({ required: true }); 
}; 

var viewModel = function() { 
    var self = this; 

    self.notes = ko.observableArray([new Note(), new Note()]); 

    self.validatedObservables = function() { 
     var arr = []; 
     ko.utils.arrayForEach(self.notes(), function(note) { 
      arr.push(note.name); 
     }); 
     return arr; 
    }; 

    self.errors = ko.validation.group(self.validatedObservables()); 

    self.submit = function() { 
     if (self.errors().length != 0) { 
      self.errors.showAllMessages(); 
     } 
    }; 

}; 

ko.applyBindings(new viewModel()); 

:私はそれを動作させるために管理する唯一の方法は、この(JSFIDDLE included)のようなものです。ソースコードによると、あなたは、単にko.validation.groupする、観察を渡すことができます。

self.errors = ko.validation.group(self.notes()); 

しかし、これは動作しません。

答えて

14

グループ化を深く(再帰的に)行うための設定オプションがあります。 self.errors = ko.validation.group(self.notes(), {deep: true});

ここ

更新フィドル:http://jsfiddle.net/KHFn8/4116/

ところで、あなたはそれがはるかに短い形式で書くことができなかった方法:

これは、例えば、グローバル ko.validation.init({ grouping: { deep: true } }) または groupコール自体のいずれかに設定することができます
self.errors = ko.validation.group(
    ko.utils.arrayMap(self.notes(), function(note) { return note.name })); 

: 私のフィドルは最新バージョンのKO検証では機能しません。私が答えを出した時の最新のバージョン(2012年6月)を使って同じフィドルがあります:http://jsfiddle.net/KHFn8/4117/

+0

偉大な、男、あなたは一日に保存!もう一つだけあります。それは正常に動作しますが、後で配列に別のインスタンスを追加すると、グループには含まれません。 [このフィドルを見てください](http://jsfiddle.net/KHFn8/340/) – Dziamid

+0

ノックアウトについて私が好きなのは、あなたの道に立つ魔法がないということです。再び、私は私の問題を解決しました。コードは冗長ですが動作します - 動的に追加された項目がバリデーションに追加されました。 [フィドル](http://jsfiddle.net/KHFn8/344/)。 – Dziamid

+0

-1:このフィドルは検証を行いません。 –

2

コメントするには低い評判が必要です。だから別の答えが来る。 antishokの縫い目によって提供された手品で答えはもう働きません。 (knockout.jsへのリンクは壊れていましたが、それを修正してノックアウト3.0への作業リンクを追加してもまだ動作していませんでした)

ko.validation.group()の周りにko.computedを追加してそのように働く。

self.errors = 
    ko.computed(function() { 
     return ko.validation.group(self.notes(), { deep: true })}); 

http://jsfiddle.net/bezFR/17/(更新)

私はこれを行うには良い方法があるが、今のところ、それは私の問題を解決して推測している、と私はよりよい解決策を見て/修正することを楽しみにしています:)

関連する問題