jQuery 验证插件指定要在验证规则参数中使用的复合规则



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

最新更新