mpe*_*pen 5 javascript jsonschema ajv
我正在评估使用JSON Schema来验证表单数据。
当您使用AJV单击提交时,我可以使用它来验证我的表单数据,然后使用JSON Schema的PHP 实现在服务器上再次检查它。
这部分听起来很棒,但我正在尝试弄清楚如何将它用于实时验证——即,在您填写表单/打字时进行验证。
具体来说,我可以在每次击键时运行整个验证器,但是当只有一个输入更改时验证整个表单似乎很昂贵。特别是,任何基于 AJAX 的验证(例如用户名唯一性检查)都会过于频繁地触发。
有没有人为此使用过 JsonSchema?可行吗?我将如何微调 AJV 或其他 JsonSchema 实现以仅运行输入所需的验证器?
将此与客户端集成在很大程度上取决于您在客户端使用的内容。我正在开发一个项目,使用它在 Angular 2+ 和 AJV 中动态创建表单,并且运行得非常好。
它还取决于您使用的 JSON 架构的数量。例如,我希望我的表单能够使用$data 引用,以便一个输入的有效性可以取决于其他输入的值。这基本上意味着我必须验证表单中的任何更改,因为没有有效的方法来判断$data 引用的目标值是什么。
此外,如果您的模型数据有可能在与表单交互的用户之外发生更改(例如,从其他用户的服务器中提取新数据等),那么验证其架构和模型中的模式和模型会更有弹性。整体。
一般而言,即使在具有多达 30-40 个输入值的更复杂的表单上,ajv 也需要不到 10 毫秒来验证整个表单,包括我自己的函数,以将 ajv 的错误与我的输入进行匹配以进行显示。所以我不担心性能受到影响。
编辑:至于异步验证器添加某种类型的去抖将取决于您使用的客户端,但不应该太难,并且AJV 的文档确实很完整。
编辑: 这是我对错误进行匹配和清理的循环(大多数 AJV 的错误是用户可读的,但一些像模式匹配的错误需要一些帮助,而不是向用户吐出正则表达式):
errs.forEach((err) => {
// Is this a value that is being matched to another input?
if (err.dataPath === dataPath && err.keyword === 'const' && err.schema.$data) {
return messages.push('Does not match')
}
// Don't show regex to people.
else if (err.dataPath === dataPath && err.keyword === 'pattern') {
return messages.push('Not valid format')
}
// Is the keyword 'required' and the parentPath is a match and the property is matched to err.params.missingProperty
else if (err.keyword === 'required' && err.dataPath === parentPath && err.params.missingProperty === propertyName) {
return messages.push('Required')
}
// Is the dataPath a match and no other special criteria apply
else if (err.dataPath === dataPath) {
// Cap first letter
return messages.push(err.message.charAt(0).toUpperCase() + err.message.slice(1))
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |