1

我正在尝试验证孩子年龄的条目。有效值为“<1”和 1-29。

为此,我正在尝试创建如下所示的自定义验证器。

我假设这些验证器按顺序工作,所以我一直在移动它们。

我正在测试的用例:

  1. 用户输入 30,抛出“需要小于 29”错误
  2. 用户输入 0 或什么都不输入,抛出 'please say how old' 错误
  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

我发现将两个验证规则合二为一有助于缓解一些复杂性。如果提供的值是数字,则组合验证规则会短路并返回 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 回答