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