控制 FormItem 组件的状态的几种方法
根据条件控制表单字段的状态的几种方法:
- staticOn,是否静态展示表达式,
- hiddenOn,控制是否隐藏
- visibleOn,控制是否可见,
visibleOn
和hiddenOn
除了判断逻辑相反以外,没有任何区别 - disabledOn,是否禁用
- requiredOn,是否必输
以上的表达式都使用同一种表达式,比如语法 data.xxx > 5
。data 表示是引用同一个 form 中的其它字段。也可以使用xxx >5
,但是如果这个字段没有赋值,会变成 undefined 的错误。所以最好是加上data.xxx
。
也可以使用this.xxx
,它与data.xxx
是等效的。
开发时可以加入debugger;
进入调试断点
在表达式中还可以使用工具类utils
的过滤器,官方并不建议使用。
源代码:D:\projects\amis\amis\packages\amis-core\src\utils\tpl.ts
js
// 几乎所有的 visibleOn requiredOn 都是通过这个方法判断出来结果,很粗暴也存在风险,建议自己实现。
// 如果想自己实现,请通过 setCustomEvalExpression 来替换。
export function evalExpression(expression: string, data?: object): boolean {
if (typeof customEvalExpressionFn === 'function') {
return customEvalExpressionFn(expression, data);
}
if (!expression || typeof expression !== 'string') {
return false;
}
/* jshint evil:true */
try {
if (
typeof expression === 'string' &&
expression.substring(0, 2) === '${' &&
expression[expression.length - 1] === '}'
) {
// 启用新版本的公式表达式
return !!evalFormula(expression, data);
}
// 后续改用 FormulaExec['js']
let debug = false;
const idx = expression.indexOf('debugger');
if (~idx) {
debug = true;
expression = expression.replace(/debugger;?/, '');
}
let fn;
if (expression in EVAL_CACHE) {
fn = EVAL_CACHE[expression];
} else {
fn = new Function(
'data',
'utils',
`with(data) {${debug ? 'debugger;' : ''}return !!(${expression});}`,
);
EVAL_CACHE[expression] = fn;
}
data = data || {};
return fn.call(data, data, getFilters());
} catch (e) {
console.warn(expression, e);
return false;
}
}
处理原理是把用户的表达式封装成一个匿名的函数,并绑定表单的数据。
测试
json
{
"searchable": true,
"sortable": true,
"type": "status",
"staticOn": "console.log(`this,data,utils==========>`,this === data,this,data,utils)",
"id": "u:539fbcb8d611",
"label": "允许空值",
"name": "nullable"
}