本文摘要
针对泛微 E10 表单中明细表的动态选项控制,文章以学生成绩表为例,介绍在数据联动事件触发后遍历明细表各行,判断分数为空或零时移除成绩类型下拉中的优秀与良好选项。核心是利用表单 SDK 获取字段标识、行标识并操作选项,适用于明细表联动场景,实际可按业务条件灵活调整。
在表单开发中,明细表(动态表格)的字段联动和数据控制是常见需求。比如当某个字段的值满足特定条件时,需要动态隐藏另一个字段的部分选项。本文通过一个简化的 Demo,演示如何实现这一功能。
场景说明
假设我们有一个“学生成绩表”明细表,包含两个字段:
- 成绩类型(type):下拉选择框,选项为
["优秀(0)", "良好(1)", "及格(2)", "不及格(3)"] - 分数(score):数字输入框
需求:当“分数”字段的值为空或 0 时,自动隐藏“成绩类型”中的“优秀”和“良好”选项(即移除选项值为 0 和 1 的选项)。
实现思路
- 获取明细表及字段的标识(ID)
- 监听数据联动事件(如分数变化后触发)
- 遍历明细表的每一行,判断分数值是否符合条件
- 若符合条件,隐藏当前行“成绩类型”的指定选项
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"); } });});代码解析
-
字段标识获取 通过
formSdk.convertFieldNameToId方法,将字段名转换为表单内部使用的 ID,需传入字段名和明细表 ID(确保在明细表中唯一)。 -
事件监听 使用
formSdk.registerAction监听ACTION_DATA_LINKAGE事件,该事件在数据联动(如字段值变化、表单加载完成等场景)时触发,确保逻辑在数据更新后执行。 -
行遍历处理
- 通过
formSdk.getDetailAllRowIndexStr获取所有行的 ID 字符串,拆分后得到每一行的唯一标识(rowId)。 - 对每一行,通过
formSdk.getFieldValue获取分数值,判断是否为空或 0。
- 通过
-
选项隐藏 当条件满足时,调用
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 拼接规则是实现明细表动态控制的核心,掌握这些可灵活应对各类明细表处理场景。