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
的内容会导致冲突。
现在我想我会把它们放在全球范围内,但是如果有人有更清洁的方式(或者在解析文档时我错过了'正确的方法')请分享。谢谢:))
答案 0 :(得分:1)
引用OP:
“我的问题是如何执行此类复合规则并将其指定为
validate()
方法的规则参数的一部分?”
.addClassRules()
方法会创建复合规则,您只能 将内联声明为class
。
如果您需要规则,可以在.validate()
内声明,那么您可以使用addMethod
方法。
或者,可以将复合规则分配给可在.validate()
中使用的变量。
否则,我真的不明白“入侵全球范围”是一个什么样的问题担心。您可以使用提供的选项,也可以创建自己的选项。我没有看到如何在没有“全局范围”入侵的情况下为任何插件定制任何选项。
引用OP:
“此外,我冒着更高版本插件的风险,指定类似customRules的内容会导致冲突”
我认为这种可能性很小,而且可能是不可能的。即使使用与现有方法相同的名称使用.addMethod()
方法创建自定义方法,也只使用第二个实例...该实例将是您的自定义规则,因为它是在包含插件的方法之后定义的。
您还可以使用jQuery extend()
method将自定义复合规则组合到新的复合规则集中。