Skip to content
导航栏

控制 FormItem 组件的状态的几种方法

根据条件控制表单字段的状态的几种方法:

  • staticOn,是否静态展示表达式,
  • hiddenOn,控制是否隐藏
  • visibleOn,控制是否可见,visibleOnhiddenOn除了判断逻辑相反以外,没有任何区别
  • 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"
}