:::danger 自定义校验从 RenderEngine 5.3.0 版本开始支持 :::
function validateRule(value) {
if (value > 20) {
return true;
}
return false;
}
value
: 当前表单的值。
function validateRule(value, state, ctx) {
const preVal = ctx.store.get('fieldId').getVal();
if (preVal > value) {
return true;
}
return false;
}
value
: 当前表单的值。
state
: 当前表单的 state。
ctx
: 渲染引擎上下文
返回值
必须是 true or false。
多错误输出校验
多错误输出校验需要使用 state.invokeValidate 这个 API.
function validateRule(value, state, ctx) {
const preVal = ctx.store.get('fieldIdPre').getVal();
if (preVal > value) {
state.invokeValidate(false, '错误信息1');
return false;
}
const nextVal = ctx.store.get('fieldIdNext').getVal();
if (nextVal > value) {
state.invokeValidate(false, '错误信息2');
return false;
}
return true;
}
自定义异步校验
自定义异步校验需要使用 state.invokeValidate 这个 API.
function validateRule(value, state, ctx) {
const preVal = ctx.store.get('fieldId').getVal();
ctx.dp.fetch({
url: 'url',
data: { value },
}).then((content) => {
if (content.result) {
state.invokeValidate(true, '');
} else {
state.invokeValidate(false, '错误信息');
}
});
return true;
}
注意:由于校验是异步的,当你使用 form.getData() 时拿到的验证结果是不准确的,当你有异步校验时,需要在调用 form.getData() 前先执行下你的异步校验,通过后再调用 form.getData()。
具体实现,可将异步校验封装成一个通用的 action
export function validateAsync(ctx) {
return new Promise((resolve, reject) => {
ctx.dp.fetch({
url: 'url',
data: { value },
}).then((content) => {
if (content.result) {
resolve(content)
} else {
reject(content)
}
});
});
}
在自定义校验回调和提交数据时分别调用
function validateRule(value, state, ctx) { // 自定义校验回调
const preVal = ctx.store.get('fieldId').getVal();
ctx.execAction('validateAsync').then((content) => {
if (content.result) {
state.invokeValidate(true, '');
} else {
state.invokeValidate(false, '错误信息');
}
});
return true;
}
function formSubmit(value, state, ctx) { // 提交数据
const preVal = ctx.store.get('fieldId').getVal();
ctx.execAction('validateAsync').then((content) => {
if (content.result) {
cosnt data = ctx.store.getForm().getData();
if (data.success) {
// 提交数据到后台
}
} else {
state.invokeValidate(false, '错误信息');
}
});
}