MENU

[泛微 E10] 明细表处理示例JS 1:字段联动后判断明细表数据隐藏选项

• 2025 年 07 月 09 日 • 阅读: 54 • OA

在表单开发中,明细表(动态表格)的字段联动和数据控制是常见需求。比如当某个字段的值满足特定条件时,需要动态隐藏另一个字段的部分选项。本文通过一个简化的 Demo,演示如何实现这一功能。

场景说明

假设我们有一个“学生成绩表”明细表,包含两个字段:

  • 成绩类型(type):下拉选择框,选项为 ["优秀(0)", "良好(1)", "及格(2)", "不及格(3)"]
  • 分数(score):数字输入框

需求:当“分数”字段的值为空或 0 时,自动隐藏“成绩类型”中的“优秀”和“良好”选项(即移除选项值为 0 和 1 的选项)。

实现思路

  1. 获取明细表及字段的标识(ID)
  2. 监听数据联动事件(如分数变化后触发)
  3. 遍历明细表的每一行,判断分数值是否符合条件
  4. 若符合条件,隐藏当前行“成绩类型”的指定选项

Demo 代码实现

// 明细表标识(实际开发中通常由表单 SDK 自动生成)
const detailTableId = "student_score_table";

// 获取明细表中字段的 ID(参数:字段名,明细表 ID)
const typeFieldId = formSdk.convertFieldNameToId("type", detailTableId);
const scoreFieldId = formSdk.convertFieldNameToId("score", detailTableId);

// 监听数据联动事件(当字段值变化时触发)
formSdk.registerAction(window.WeFormSDK.ACTION_DATA_LINKAGE, (data) => {
  // 获取明细表所有行的 ID 字符串(格式:"row1,row2,row3")
  const allRowIdsStr = formSdk.getDetailAllRowIndexStr(detailTableId);
  
  if (!allRowIdsStr) return; // 无数据行时直接返回
  
  // 解析行 ID 为数组
  const rowIds = allRowIdsStr.split(',');
  
  // 遍历每一行
  rowIds.forEach(rowId => {
    // 拼接当前行的分数字段 ID(格式:字段 ID_行 ID)
    const currentScoreField = `${scoreFieldId}_${rowId}`;
    // 获取当前行的分数值
    const scoreValue = formSdk.getFieldValue(currentScoreField);
    
    // 判断分数是否为空或 0
    if (scoreValue === '' || scoreValue === '0' || scoreValue === 0) {
      // 拼接当前行的成绩类型字段 ID
      const currentTypeField = `${typeFieldId}_${rowId}`;
      // 移除选项值为 0 和 1 的选项(即"优秀"和"良好")
      formSdk.removeSelectOption(currentTypeField, "0,1");
    }
  });
});

代码解析

  1. 字段标识获取
    通过 formSdk.convertFieldNameToId 方法,将字段名转换为表单内部使用的 ID,需传入字段名和明细表 ID(确保在明细表中唯一)。
  2. 事件监听
    使用 formSdk.registerAction 监听 ACTION_DATA_LINKAGE 事件,该事件在数据联动(如字段值变化、表单加载完成等场景)时触发,确保逻辑在数据更新后执行。
  3. 行遍历处理

    • 通过 formSdk.getDetailAllRowIndexStr 获取所有行的 ID 字符串,拆分后得到每一行的唯一标识(rowId)。
    • 对每一行,通过 formSdk.getFieldValue 获取分数值,判断是否为空或 0。
  4. 选项隐藏
    当条件满足时,调用 formSdk.removeSelectOption 方法,传入当前行的“成绩类型”字段 ID 和需要移除的选项值("0,1"),实现选项的动态隐藏。

关键 API 说明

方法作用
convertFieldNameToId(fieldName, detailTableId)将字段名转换为表单内部 ID(明细表字段需传入明细表 ID)
registerAction(actionName, callback)注册事件监听,这里监听数据联动事件
getDetailAllRowIndexStr(detailTableId)获取明细表所有行的 ID 字符串(格式:"row1,row2")
getFieldValue(fieldId)获取指定字段的值
removeSelectOption(fieldId, optionValues)移除下拉框的指定选项(optionValues 为逗号分隔的选项值)

总结

通过上述方法,我们实现了明细表中字段联动后的动态选项控制。实际开发中,可根据业务需求调整判断条件(如分数大于 90 时显示特定选项)或扩展字段逻辑(如多字段联合判断)。表单 SDK 的事件机制和行 ID 拼接规则是实现明细表动态控制的核心,掌握这些可灵活应对各类明细表处理场景。