jQuery Validation插件指定要在validate rules参数中使用的复合规则

时间:2013-11-21 17:03:27

标签: jquery jquery-validate

jQuery验证插件(jquery.validate.js)支持addClassRules()方法。这允许我做这样的事情:

$.validator.addClassRules({
  birthdate: {
    date: true,
    notFuture: true,
    notBefore1900: true
  }
});

其中notFuture和notBefore1900是我之前通过调用.addMethod()指定的方法。

这允许我通过指定类<input class="birthdate" name="foo" />来使用它,并且它可以正常验证,根据触发无效状态的特定方法显示相应的验证错误消息。

我的问题是如何执行此类复合规则并将其指定为validate()方法的规则参数的一部分?我希望能够做到这一点:

$('#myForm').validate({
  rules: {
    foo: 'birthdate'
  }
});

遗憾的是,验证方法本身既可以表示为类名,也可以表示为

等参数中的显式规则
rules: {
  foo: 'date'
}

一个人不能对班级规则做同样的事情;它期望validate()的规则参数是方法而不是类规则。

我可以这样做:

var reusableRule = {
  date: true,
  notFuture: true,
  notBefore1900: true
};
...
$('#myForm').validate({
  rules: {
    foo: reusableRule
  }
});

但我更喜欢将内容保留在插件本身而不是侵入全局范围。我可以做这样的事情

$.validator.customRules = {
  birthdate: {
    date: true,
    ...
  }
}

然后它看起来很丑(或者至少与其他规则项的语法不一致):

$('#myForm').validate({
  rules: {
    foo: $.validator.customRules.birthdate
  }
});

此外,我冒着更高版本插件的风险,指定类似customRules的内容会导致冲突。

现在我想我会把它们放在全球范围内,但是如果有人有更清洁的方式(或者在解析文档时我错过了'正确的方法')请分享。谢谢:))

1 个答案:

答案 0 :(得分:1)

引用OP:

  

“我的问题是如何执行此类复合规则并将其指定为validate()方法的规则参数的一部分?”

  • .addClassRules()方法会创建复合规则,您只能 将内联声明为class

  • 如果您需要规则,可以在.validate()内声明,那么您可以使用addMethod方法。

  • 或者,可以将复合规则分配给可在.validate()中使用的变量。

否则,我真的不明白“入侵全球范围”是一个什么样的问题担心。您可以使用提供的选项,也可以创建自己的选项。我没有看到如何在没有“全局范围”入侵的情况下为任何插件定制任何选项。


引用OP:

  

“此外,我冒着更高版本插件的风险,指定类似customRules的内容会导致冲突”

我认为这种可能性很小,而且可能是不可能的。即使使用与现有方法相同的名称使用.addMethod()方法创建自定义方法,也只使用第二个实例...该实例将是您的自定义规则,因为它是在包含插件的方法之后定义的。


您还可以使用jQuery extend() method将自定义复合规则组合到新的复合规则集中。

以下是一些参考:https://stackoverflow.com/a/9056425/594235