私は実験を試みており、きちんと整理して再利用できるように抽象化できるカスタム バリデータを作成するための巧妙なソリューションがあるかどうかを確認しています。
以下の jsfiddle では、Measurement の配列 (値と日付のみ) を格納する単純な親モデルをまとめました。この例では、2 つの要件を入れています。
- 各 Measurement には、両方のフィールドが指定されているか、どちらも指定されていないかのいずれかです。
親配列には、少なくとも 1 つの有効な (前の条件を満たしている) 測定値が必要です。
理想的には、以下で行ったように、有効であることを定義するための検証ロジックを Measurement オブジェクト内に格納する必要があります。しかし、私が非常に不快に感じているのは、.NET の親モデルで実行しなければならない「実践的な」検証です
atLeastOne()
。
ノックアウト検証は、数字と日付の個々のフィールドを自動的に検証しますが、配列のルールに対して介入して検証を実行する必要があります。
質問: KO 検証をセットアップして、アレイが必要な条件であることを確認しながら、HasValues
メソッドがまだ測定モデルに存在することを可能にするアプローチはありますか? つまり、「少なくとも 1 つ」を検索するという概念を抽象化して、仕事を処理できる何らかのカスタム バリデーターに入れ、このバリデーターに「検証に使用してほしい関数は次のとおりです」と伝えるだけです。配列内の各アイテム。」
前もって感謝します!
function Model(data)
{
var self = this;
self.Measurements = ko.observableArray();
for(var i = 0; i < data.length; i++)
self.Measurements.push(new Measurement(data[i]));
function hasAtLeastOne(){
var atLeastOne = false;
$.each(self.Measurements(), function(i, item) {
if (item.HasValues()) {
atLeastOne = true;
return;
}
});
return atLeastOne;
}
self.Save = function() {
if (self.canSave() && atLeastOne())
alert('save');
else
alert('arg!');
};
self.errors = ko.validation.group(self);
self.canSave = ko.computed(function() {
return self.errors().length == 0;
});
}
function Measurement(data)
{
var self = this;
self.Value = ko.observable(data.val);
self.Date = ko.observable(data.date);
self.Value.extend({ required: { onlyIf: isRequired }, number: true });
self.Date.extend({ required: { onlyIf: isRequired }, date: true });
self.HasValues = function() {
return ko.utils.isNotNullUndefOrEmpty(self.Value()) &&
self.Date() && self.Date().length > 0;
};
function isRequired() {
return ko.utils.isNotNullUndefOrEmpty(self.Value()) ||
(self.Date() && self.Date().length > 0);
}
}
ko.utils.isNotNullUndefOrEmpty = function (value) {
return (typeof value === 'string' && value.length > 0) ||
(typeof value !== 'string' && value);
};
ここに私の例があるjsfiddleがあります: http://jsfiddle.net/cACZ9/