本文摘要
针对泛微 E10 表单中明细表的动态选项控制,文章以学生成绩表为例,介绍在数据联动事件触发后遍历明细表各行,判断分数为空或零时移除成绩类型下拉中的优秀与良好选项。核心是利用表单 SDK 获取字段标识、行标识并操作选项,适用于明细表联动场景,实际可按业务条件灵活调整。

在表单开发中,明细表(动态表格)的字段联动和数据控制是常见需求。比如当某个字段的值满足特定条件时,需要动态隐藏另一个字段的部分选项。本文通过一个简化的 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 拼接规则是实现明细表动态控制的核心,掌握这些可灵活应对各类明细表处理场景。