vue.js VeeValidate - 自定义验证器正确编译错误但不会切换错误 class
vue.js VeeValidate - custom validator correctly compiles errors but does not toggle error class
我写了一个这样的自定义验证器:
created () {
this.$validator.extend('validateCert', {
getMessage: (field) => {
return field + ' is not a valid certificate';
},
validate: (value) => {
return value.startsWith('-----BEGIN CERTIFICATE-----') && value.endsWith('-----END CERTIFICATE-----');
}
});
}
我已将它附加到模式内的文本区域:
<div class="pb-3 mr-4">
<b-form-textarea
type="text"
v-validate="'required|validateCert'"
data-vv-validate-on="change"
v-model.trim="signedCerts[index]"
data-vv-scope="uploadCert"
:name="'certificate_' + index"
:class="[{'is-invalid': errors.has('certificate_' + index)}]"
rows="15"/>
<fr-validation-error :validatorErrors="errors" :fieldName="'certificate_' + index"></fr-validation-error>
</div>
然后 - 单击按钮我执行以下操作:
uploadCerts (event) {
let idmInstance = this.getRequestService(),
body = {
fromCSR: true,
certs: _.each(this.signedCerts, (cert) => {
JSON.stringify(cert);
})
};
this.$validator.validateAll('uploadCert').then((valid) => {
// Prevent modal from closing
event.preventDefault();
if (valid) { // some more logic
如果我检查计算错误对象,我会看到我的验证失败:
{
"items": [
{
"id": "19",
"field": "certificate_0",
"msg": "certificate_0 is not a valid certificate",
"rule": "validateCert",
"scope": "uploadCert",
"regenerate": {
"_custom": {
"type": "function",
"display": "<span>ƒ</span> regenerate()"
}
}
}
]
}
和 'valid' 的值(真或假)在任何时候都是准确的。我只是没有看到我的错误 类 被触发。
很难完全回答这个问题,因为它部分取决于 fr-validation-error
中发生的事情,但我认为问题在于你如何使用范围。
当您定义 data-vv-scope="uploadCert"
时,这意味着每个对字段名的引用都必须在 errors
中以 uploadCert.
开头。因此,当您在 :class
中指定 errors.has('certificates_'+index)
时,您必须将其更改为 errors.has('uploadCert.certificates_'+index)
。
这是它的完整外观(减去 bootstrap-vue 和多个字段位):
<textarea
v-validate="'required|validateCert'"
data-vv-validate-on="change"
data-vv-scope="uploadCert"
v-model.trim="signedCert"
name="certificate"
class="form-control"
:class="{ 'is-invalid': errors.has('uploadCert.certificate') }"
rows="10"
>
</textarea>
一个证书上传字段的完整工作示例:https://codesandbox.io/s/z2owy0r2z3
我写了一个这样的自定义验证器:
created () {
this.$validator.extend('validateCert', {
getMessage: (field) => {
return field + ' is not a valid certificate';
},
validate: (value) => {
return value.startsWith('-----BEGIN CERTIFICATE-----') && value.endsWith('-----END CERTIFICATE-----');
}
});
}
我已将它附加到模式内的文本区域:
<div class="pb-3 mr-4">
<b-form-textarea
type="text"
v-validate="'required|validateCert'"
data-vv-validate-on="change"
v-model.trim="signedCerts[index]"
data-vv-scope="uploadCert"
:name="'certificate_' + index"
:class="[{'is-invalid': errors.has('certificate_' + index)}]"
rows="15"/>
<fr-validation-error :validatorErrors="errors" :fieldName="'certificate_' + index"></fr-validation-error>
</div>
然后 - 单击按钮我执行以下操作:
uploadCerts (event) {
let idmInstance = this.getRequestService(),
body = {
fromCSR: true,
certs: _.each(this.signedCerts, (cert) => {
JSON.stringify(cert);
})
};
this.$validator.validateAll('uploadCert').then((valid) => {
// Prevent modal from closing
event.preventDefault();
if (valid) { // some more logic
如果我检查计算错误对象,我会看到我的验证失败:
{
"items": [
{
"id": "19",
"field": "certificate_0",
"msg": "certificate_0 is not a valid certificate",
"rule": "validateCert",
"scope": "uploadCert",
"regenerate": {
"_custom": {
"type": "function",
"display": "<span>ƒ</span> regenerate()"
}
}
}
]
}
和 'valid' 的值(真或假)在任何时候都是准确的。我只是没有看到我的错误 类 被触发。
很难完全回答这个问题,因为它部分取决于 fr-validation-error
中发生的事情,但我认为问题在于你如何使用范围。
当您定义 data-vv-scope="uploadCert"
时,这意味着每个对字段名的引用都必须在 errors
中以 uploadCert.
开头。因此,当您在 :class
中指定 errors.has('certificates_'+index)
时,您必须将其更改为 errors.has('uploadCert.certificates_'+index)
。
这是它的完整外观(减去 bootstrap-vue 和多个字段位):
<textarea
v-validate="'required|validateCert'"
data-vv-validate-on="change"
data-vv-scope="uploadCert"
v-model.trim="signedCert"
name="certificate"
class="form-control"
:class="{ 'is-invalid': errors.has('uploadCert.certificate') }"
rows="10"
>
</textarea>
一个证书上传字段的完整工作示例:https://codesandbox.io/s/z2owy0r2z3