knockout.js - 自定义 knockout validation 3 参数

标签 knockout.js knockout-validation

我想创建一个自定义的 knockout 验证规则,该规则将接受当前 observable 的值、要与之进行比较的值以及一个条件。

我在网上看到的所有示例都只有两个参数传递到自定义验证中。

我已经做了一个变通方法来传递一个包含要比较的值和条件的数组,但这有点笨拙。我的消息格式也输出数组中的值,而不仅仅是 otherVal .

例如:

/*
* Compares two values only if the specified condition is true.
* Parameters: 
*   array[0] - otherVal
*   array[1] - conditional
*
* Returns:
*   true if the condition is false.
*   true if the condition is true AND val is lessThanOrEqualTo otherVal
*   false otherwise
*
* Usage:
*   Used to validate observables conditionally.
*
* Example:
*   self.salary = ko.observable().extend({ 
                      mustLessThanOrEqualConditional: [100, isFieldEditable]})
*/
ko.validation.rules['mustLessThanOrEqualConditional'] = {
  validator: function(val, array) {
      if (array[1]) {
          return val <= array[0];
      }
      return true;
  },
  message: 'The field must be <= {0}'
};

有没有办法将三个参数传递给验证函数,例如:
ko.validation.rules['mustLessThanOrEqualConditional'] = {
    validator: function(val, otherVal, condition) {
        if(condition){
            return val <= otherVal;
        }
        return true;
    },
    message: 'The field must be <= {0}'
}

最佳答案

而不是 Array ,你可以使用一个对象:

ko.validation.rules['mustLessThanOrEqualConditional'] = {
  validator: function(val, params) {
      if (params.condition) {
          return val <= params.otherVal;
      }
      return true;
  },
  message: 'The field must be <= {0}'
};

model.obs.extend({ mustLessThanOrEqualConditional: {
                       params: { otherVal: 3, condition: 1 != 0 }
                   }
                });

尽管在您的情况下,我建议使用 onlyIf 功能代替:
ko.validation.rules['mustLessThanOrEqualConditional'] = {
  validator: function(val, params) {
      return val <= params.otherVal;
  },
  message: 'The field must be <= {0}'
};

model.obs.extend({ mustLessThanOrEqualConditional: {
                       onlyIf: function () { /* your test here */ },
                       params: { otherVal: 3 }
                   }
                });

由于我是一个非常好的人,这是我使用的规则:
ko.validation.rules['compareTo'] = {
    message: "Compare to",
    validator: function (val, params) {
        if (val === null || params.value() === null)
            return params.allowNull;
        switch (params.way) {
            case "<": return val < params.value();
            case "<=": return val <= params.value();
            case ">": return val > params.value();
            case ">=": return val >= params.value();
            default: throw new Error("params is not well defined");
        }
    }
}

model.obs.extend({ compareTo: { 
                       message:"your message", 
                       params: { 
                                   way: ">=", 
                                   value: model.otherObs, 
                                   allowNull: true 
                       }, 
                       onlyIf: function () { /*your test*/ } 
                    }});

关于knockout.js - 自定义 knockout validation 3 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24696929/

相关文章:

javascript - 如何限制 ko.observable 并将余数放入另一个字段

Javascript 迭代一组属性

javascript - knockout pureComputed 不工作

javascript - 向链接添加多个 knockout 点击事件

javascript - Knockout.js 中计算的可观察函数的数据上下文

javascript - 自定义组件的构造函数中的参数始终未定义

javascript - 定义,Knockoutjs, "text!"

javascript - Knockout.js 的 View 模型声明。有两种方法

javascript - 为什么此模式不适用于 knockout validation ? (分隔的邮政编码)

asp.net-mvc - 基于 Knockout 的应用程序框架