我有一个巨大的输入表单,需要用数据填充,并能够保存进度,以便以后完成表单,但只有当表单适合1个自定义规则时:
- 表单能够被保存,当它不包含任何禁止的词(我们假设禁止的词是[TEST1, TEST2])
这意味着例如我有这样的验证规则:
validations: {
A: {
required,
$each: {
Aa: { required },
Ab: { required, dontHaveForbiddenWords },
Ac: { required, dontHaveForbiddenWords }
},
},
B: {
required,
Ba: { required, dontHaveForbiddenWords },
Bb: { required },
}
// ... a lot of additional fields
}
在这种情况下,我希望表单能够在所有字段为空时保存(因为它不包含禁用词)即使它有未填充的必需字段。
问题是,由于required
规则,表单具有$invalid
状态,我不知道如何绕过它。
更新:这个答案不起作用,这是我的侥幸和糟糕的测试,我设置为条件检查的标志不在this.$v.$touch()
上重新应用,并始终保持默认值
作为@EstusFlask建议我已经创建了一个自定义验证器,所以我可以在某些情况下关闭它,它使用顶级变量而不是参数,因为我想一次否决所有字段的验证器,也在我的项目中,我有条件required validators
,我发现没有创建一个更好的解决方案,如果你会编辑我的解决方案,我会很高兴:
import { helpers } from 'vuelidate/lib/validators';
let isRequired = true;
const customRequiredValidator = (value) => {
return isRequired ? helpers.req(value) : true;
}
在后面的代码中,我有2个处理程序:- onSave(),我把
required
规则关闭 - onSumbit()在那里我设置
required
规则返回ON
像这样
onSave() {
isRequired = false;
if (this.$v.$invalid) {
isRequired = true;
// show alert
return;
}
isRequired = true;
// save form progress
}
// isRequired is always true after onSave
onSubmit() {
this.$v.$touch(); // to trigger the validation
if (this.$v.$invalid) return; // show alert
// sumbit the form
}
有效的解决方案是使用JSON.stringify()
我的团队将其与字符串化validationState
配对,并在包含validationRule名称的regex字符串上测试它,在我的情况下是dontHaveForbiddenWords
,并检查false
值,这意味着至少一个规则在整个表单上失败:
hasForbiddenCharacters() {
const validationStateString = JSON.stringify(this.$v.currentOffer, null, 0)
const hasForbiddenCharacters = /"dontHaveForbiddenWords":false/.test(validationStateString)
return hasForbiddenCharacters;
}