5

私は実験を試みており、きちんと整理して再利用できるように抽象化できるカスタム バリデータを作成するための巧妙なソリューションがあるかどうかを確認しています。

以下の jsfiddle では、Measurement の配列 (値と日付のみ) を格納する単純な親モデルをまとめました。この例では、2 つの要件を入れています。

  1. 各 Measurement には、両方のフィールドが指定されているか、どちらも指定されていないかのいずれかです。
  2. 親配列には、少なくとも 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/

4

1 に答える 1