amis-core/src/utils/filter.ts里是内置的所有filter过滤器实现。比如:raw、url_encode等
相关介绍文档:https://aisuda.bce.baidu.com/amis/zh-CN/docs/concepts/data-mapping
amis-formula/src/evalutor.ts 里是内置的所有表达式中可用的逻辑函数的实现。 比如:CONCATENATE(fnCONCATENATE)、LOWER(fnLOWER)等
相关介绍文档:https://aisuda.bce.baidu.com/amis/zh-CN/docs/concepts/expression
一、自定义表单项valid校验规则:
比如定义一个customValid,可以写自定义逻辑校验。函数内可用参数:1.value为当前校验的表单项值,2.values为所有表单项值。
1.注册一个自定义校验规则
amisLib.addRule(
'customValid', //自定义函数校验 "customValid": "return value===values.password"; value为当前校验的表单项值,values为所有表单项值
function (values, value, func) {
let flag = new Function('values', 'value', func)(values, value);
return flag || false;
},
`格式校验出错`
);
2.用法如下:
{
"type": "input-number",
"label": "密码确认",
"name": "repeatPassword",
"validations": {
"customValid": "return value===values.password"; " //校验规则
},
"validationErrors": {
"customValid": "俩次输入的密码不匹配" //校验失败的提示信息
}
}
二、自定义filter过滤器:
filter 主要用于amis中表达式解析,可以提供自定义处理逻辑。
PS: amis表达式中还可以使用IF、ABS等逻辑函数来处理,但不支持自定义逻辑函数。
比如 定义一个doOptions 过滤器,将数组转为select Options结构
//转换options结构函数
function doOptions(arr, filter, extraParams){
return _.map(filter !== undefined ? _.filter(arr, filter) : arr, (n) => {
const result = {
label:
n["label"] ||
n["title"] ||
n["browseName"] ||
n["displayName"],
value: n["name"] || n["value"],
};
_.forEach(extraParams, extraParam => {
result[extraParam] = n[extraParam];
});
return result;
});
//注册amis自定义filter
amisLib.registerFilter('doOptions', function (arr, filter, extraParams) {
filter = resolveFilter(filter);
extraParams = extraParams?.split(",");
return doOptions(arr, filter, extraParams);
});
2.使用时 在表达式中如下方式使用即可:
{
"type": "select",
"name": "target",
"label": "转换状态名称",
"source": "${topnode.children|doOptions }",
}
额外:
注册自定义filter时可以覆盖这些默认的filter过滤器,比如说 raw和html过滤器。处理方法如下:
//html默认是用于input组件中label属性( "label": "${ddddd}")、tpl中tpl属性("tpl": "${xxxx}")等html元素属性。
//raw默认用于api接口调用时的data属性(数据映射)"data":{"perPage": "${perPage}", "page": "${page}"} 和 responseData属性(返回结果映射) "responseData": { "rows": "${rows}" } 。
const amisLib = amisRequire('amis');
const _filters = {...amisLib.filters}; //amis内置的一些filter过滤器
//自定义amisFilter
function amisFilter() {
['raw', 'html'].forEach(funcName =>{ //覆盖raw和html测试 也可以Object.keys(_filters || {})全部覆盖,但没必要
amisLib.registerFilter(funcName, function(...params) { //接受参数
//自定义逻辑添加
const [input] = params;
console.log(`覆盖默认 ${funcName}` , input);
if(!input) return "自定义值解析失败"
//解构params 并调用原始的amis过滤器,保证过滤器逻辑正常
return _filters[funcName](...params);
});
})