淘汰验证 - 自定义验证器

时间:2013-07-03 19:29:33

标签: knockout.js knockout-2.0 knockout-validation

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

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

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

用例我正在测试:

  1. 用户输入30,抛出'需要小于29'错误
  2. 用户输入0或无,抛出'请说多大'错误
  3. 用户输入'6个月',因为他们将错误值更改为'< 1'
  4. 用户输入'< 1'没有错误
  5. 用户输入1或2或3或4 ...,没有错误
  6. 我无法完成所有这些测试。 #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'"
            }]
        });
    };
    

1 个答案:

答案 0 :(得分:3)

我发现将两个验证规则合并为一个有助于缓解一些复杂问题。如果提供的值是数字,则组合的验证规则会短路并返回true,这样就不会无意中尝试检查值是否与'&lt; 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/