【问题标题】:knockout validation - custom validators淘汰赛验证 - 自定义验证器
【发布时间】:2013-07-01 15:35:25
【问题描述】:

我正在尝试验证儿童年龄的条目。有效值为“

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

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

我正在测试的用例:

  1. 用户输入 30,抛出“需要小于 29”错误
  2. 用户输入 0 或不输入任何内容,抛出“please say how old”错误
  3. 用户输入“6 个月”,引发错误,让他们将值更改为“
  4. 用户输入“
  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'"
        }]
    });
};

【问题讨论】:

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


    【解决方案1】:

    我发现将两个验证规则合二为一有助于减轻一些复杂性。如果提供的值是数字,则组合验证规则会短路并返回 true,这样它就不会无意中尝试检查值是否匹配 '

    我还利用了 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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-21
      • 2012-02-18
      • 1970-01-01
      • 2016-08-13
      • 2012-08-07
      • 2012-11-04
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多