8

ノックアウト検証ライブラリを使用して、オブジェクトの配列を検証しようとしています。オブザーバブルの配列に対して検証グループを形成する方法は、私には簡単ではありません。私がなんとかそれを機能させる唯一の方法は、次のようなものです( JSFIDDLE が含まれています):

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());

私のアプローチは不必要に冗長なようです。ソース コードによると、observable を ko.validation.group に渡すだけです。

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

しかし、これはうまくいきません。

4

2 に答える 2

14

グループ化を深く (再帰的に) するための構成オプションがあります。グローバルに設定することもko.validation.init( { grouping: { deep: true } } )group呼び出し自体で設定することもできます。次に例を示します。self.errors = ko.validation.group( self.notes(), {deep: true} );

ここでフィドルを更新しました:http://jsfiddle.net/KHFn8/4116/

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

self.errors = ko.validation.group(
    ko.utils.arrayMap(self.notes(), function(note) { return note.name }));

編集: 私のフィドルは、KO 検証の最新バージョンでは動作しなくなりました。これは、私が回答した時点(2012年6月)の最新バージョンを使用した同じフィドルです:http://jsfiddle.net/KHFn8/4117/

于 2012-06-07T19:27:43.947 に答える
2

私はコメントするために評判を低くしなければなりません。だからここに別の答えがあります。アンチショックシームによって提供されたフィドルが機能しなくなったという答え。(knockout.js へのリンクが壊れていましたが、それを修正し、knockout 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/ (更新)

これを行うにはもっと良い方法があると思いますが、今のところそれで問題は解決しています。修正されることを楽しみにしています/より良い解決策を見てください:)

于 2013-11-05T13:44:58.750 に答える