这是一个无耻的插件,但我可以自愿提供一个我设计的框架吗?我已经基于注释(a la Hibernate Validator)构建了它。它支持自定义约束,我觉得它非常强大。这也是一个 Stackoverflow 问题,我要求对框架进行审查。
- 演示:使用自定义验证约束,您可以将验证绑定到 onChange 元素。此外,由于 Regula 支持自定义验证器,您可以让自定义验证器更新字段的值(因此更改
5
为5.00
)。
- 副作用:Regula 通过自定义约束验证器支持副作用。
- 组:Regula 支持验证组。您可以针对特定组进行验证。通过组合自定义验证器和组,您可以控制验证器的行为,以便仅在填充该组的所有元素时才进行验证(尽管您必须通过普通 Javascript 执行此检查)。
- 服务器端验证:使用自定义约束,您可以进行 AJAX 调用以执行服务器端验证。根据当前框架的结构方式,这必然是一个阻塞的 ajax 调用。我计划在未来添加异步功能。
- 每页多个表单:Regula 不限于每页验证一个表单。它可以处理多种形式(不确定我是否正确理解您的要求 - 所以我可能没有正确回答这部分)。
- 可定制的错误显示:就验证而言,Regula 不会对页面的 UI 做任何事情。验证时,您会得到一组包含错误消息等的约束违规。如何显示它们取决于您。
- Snappiness:我没有执行任何基准测试,所以我无法评论我的框架在这方面的表现。
- 提交按钮:这是我尚未解决的问题(异步与同步)。
这里有一些例子:
下面显示了带有内置约束的标准验证:
<input id = "myInput"
name = "myInput"
type = "text"
class = "regula-validation"
data-constraints = '@NotEmpty @IsNumeric @Between(min=1, max=5)' />
jQuery(document).ready(function() {
// must call regula.binnd() first. The best place would be in an
// onload handler. This function looks for elements with
// a class name of "regula-validation" and binds the
// appropriate constraints to the elements
regula.bind();
jQuery("#myForm").submit(function() {
// this function performs the actual validation
var validationResults = regula.validate();
for(var index in validationResults) {
var validationResult = validationResults[index];
alert(validationResult.message);
}
});
});
如您所见,您只处理违反约束的情况,因此显示错误消息的方式完全取决于您。
这是自定义约束的示例:
regula.custom({
name: "MustBe42",
defaultMessage: "The answer must be equal to 42",
validator: function() {
return this.value == 42;
}
});
及其用途:
<input id = "theAnswerToLifeTheUniverseAndEverything"
name = "theAnswerToLifeTheUniverseAndEverything"
value = ""
class = "regula-validation"
data-constraints = "@MustBe42" />
由于验证器是一个 Javascript 函数,你可以让它做任何事情(所以这解决了你关于副作用的问题)。
这是另一个接受参数的约束的示例:
regula.custom({
name: "DivisibleBy",
defaultMessage: "{label} must be divisible by {divisor}",
params: ["divisor"],
validator: function(params) {
var divisor = params["divisor"];
return (this.value % divisor) == 0;
}
});
和用法:
<input id = "number"
name = "number"
value = ""
class = "regula-validation"
data-constraints = "@DivisibleBy(divisor=3, label='The Number')" />
以下是使用验证组的示例:
<input id = "score"
name = "score"
type = "text"
class = "regula-validation"
data-constraints = '@IsNumeric(label="Score",
message="{label} needs to be a number!"
groups=[FirstGroup, SecondGroup, ThirdGroup]' />
<input id = "age"
name = "age"
type = "text"
class = "regula-validation"
data-constraints = '@IsNumeric(label="Age",
message="{label} needs to be a number!"
groups=[SecondGroup]' />
<input id = "name"
name = "name"
type = "text"
class = "regula-validation"
data-constraints = '@NotEmpty(label="Name",
message="{label} cannot be empty!"
groups=[FirstGroup]' />
以及仅验证的代码段FirstGroup
(仅验证score
和name
验证):
var constraintViolations = regula.validate({groups: [regula.Group.FirstGroup]});
var messages = "";
for(var index in constraintViolations) {
var constraintViolation = constraintViolations[index];
messages += constraintViolation.message + "\n";
}
if(messages != "") {
alert(messages);
}
如果您打算尝试一下,我建议您下载1.1.1版。当前文档特别匹配该版本。在1.2.1 中,我添加了对复合约束的支持,但我没有更新我的文档来反映这一点。
我理解这是否不能解决您的所有问题,或者这不是您想要的。我以为我只是把它放在那里。另外,如果您确实检查了它,那么我将确保更新文档以反映版本1.2.1。我一直忙于学校和工作,所以我没有时间去做。
更新 #1
Sohnee提到了客户端验证。我实际上正在研究 Regula 和 Spring 3 之间的集成。希望我能很快发布它(再次取决于工作和学校)。集成的工作原理是将 Hibernate 验证约束转换为 Regula 验证约束。这样,您只需编写一次验证代码(大多数情况下)。但是对于自定义约束,您仍然需要在 Javascript 端(自定义验证器)编写代码。但是一旦您使用 Hibernate 验证约束在服务器端注释代码,您就无需在客户端执行任何操作;这些约束会自动应用于客户端的表单元素。
Matthew Abbott还能够将 Regula 与 ASP.NET MVC 集成。
更新 #2
我在 github 上有一个演示 webapp(mavenized),它展示了 Regula 和 Spring 3.0.x Web MVC 之间使用 Hibernate Validator 的集成。它没有真正记录或任何东西,它更像是概念证明。我计划向 github 页面添加一些关于集成及其工作原理的文档。
更新 #3
我已经更新了wiki上的文档,它现在对应于最新版本1.2.2(我做了一个小错误修正,这就是它现在是1.2.2 的原因)。