1

子供の年齢のエントリを検証しようとしています。有効な値は「<1」および 1 ~ 29 です。

このために、以下のようなカスタムバリデータを作成しようとしています。

これらのバリデーターは順番に動作すると想定しているので、それらを動かしてきました。

私がテストしているユースケース:

  1. ユーザーが 30 を入力すると、「29 未満である必要があります」というエラーがスローされます
  2. ユーザーが 0 を入力するか何も入力しないと、「年齢を教えてください」というエラーがスローされる
  3. ユーザーが「6 か月」と入力すると、値を「<1」に変更するとエラーが発生する
  4. ユーザーが「<1」と入力してもエラーはありません
  5. ユーザーは 1 または 2 または 3 または 4... を入力します。エラーはありません

私はこれらすべてのテストを通過できませんでした。#5 失敗。

var ChildModel = function(cookieAge){
    var self = this,
        age = cookieAge || "";
    self.age = ko.observable(age).extend({
        validation: [{
            validator: function (val) {
                return val !== "" || parseInt(val,10) === 0;
            },
            message: 'Please say how old this child is.'
        },{
            validator: function (val, someOtherVal) {
                return val=== "<1" || val <= someOtherVal;
            },
            message: "This child's age must be less than or equal to 29.",
            params: 29
        },{
            validator: function (val) {
                var text = val.match(/(\D+)/g);
                log(text);
                return val.match(/^[0-9].$/) || text && text.length > 0;
            },
            message: "(contains text) For Children less than 1, please use '<1'"
        }]
    });
};
4

1 に答える 1

3

2 つの検証ルールを 1 つにまとめることで、いくつかの複雑さが緩和されることがわかりました。結合された検証ルールは短絡し、提供された値が数値の場合は true を返します。これにより、値が「<1」に一致するかどうかを誤ってチェックしようとすることがなくなります。

また、isEmptyVal ユーティリティ メソッドを利用して、値が空かどうかを検出しました。組み込みの検証ルールをいくつか使用してvalidation:みましたが、機能していないことがわかりました。これにはいくつかの制限があると思います。

    validation: [{
        validator: function (val) {
            return !ko.validation.utils.isEmptyVal(val) && parseInt(val,10) !== 0;
        },
        message: 'Please say how old this child is.'
    },{
        validator: function (val, someOtherVal) {
            if (!isNaN(val)) {
                if (val > someOtherVal) {
                    this.message = "This child's age must be less than or equal to 29.";
                    return false;
                }
                return true;
            }

            if (val !== '<1') {
                this.message = "(contains text) For Children less than 1, please use '<1'";
                return false;
            }
            return true;
        },
        params: 29
    }]

フィドル: http://jsfiddle.net/Rkkha/

于 2013-07-04T01:16:10.430 に答える