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'
}
不能对类规则做同样的事情;它期望规则参数验证((是一个方法而不是一个类规则。
我可以做这样的事情:
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
会导致冲突的风险。
现在我想我会将它们保留在全球范围内,但如果有人有更干净的方法(或者如果我在解析文档时错过了"正确的方法"(,请分享。 谢谢:)
引用 OP:
"我的问题是,我如何执行这样的复合规则,并将它们指定为
validate()
方法的规则参数的一部分?">
-
.addClassRules()
方法创建复合规则,您只能以内联方式声明为class
。 -
如果你想要一个可以在
.validate()
中声明的规则,那么你将使用addMethod
方法。 -
或者,可以将复合规则分配给可在
.validate()
中使用的变量。
否则,我真的看不出"入侵全球范围"是担心的问题。 您可以使用提供的选项,也可以创建自己的选项。 我不明白你如何在不入侵"全局范围"的情况下为任何插件自定义任何选项。
引用 OP:
"此外,我冒着更高版本的插件指定类似 customRules 之类的东西的风险,这会导致冲突">
我认为这是极不可能的,而且可能是不可能的。 即使您使用与现有方法同名的.addMethod()
方法创建自定义方法,也只会使用第二个实例...该实例将是您的自定义规则,因为它是在包含插件的方法之后定义的。
您还可以使用 jQuery extend()
方法将自定义复合规则组合到新的复合规则集中。
以下是一些参考: https://stackoverflow.com/a/9056425/594235