表单中获取子表单的值赋值给当前主表单
1. 使用场景
需要获取子表单值的时候,比如当前出库表中的明细表,我们可以按照下面案例来操作获取。
2. 实现功能
2.1. 创建表单
主表成员字段需开启多选模式。
如下图所示:
2.2. 子表单绑定下述事件
如下图所示:
下述代码可以直接复制使用,请注意表单唯一标识的替换!,子表成员单选模式和多选模式的处理方式也不一致。
// 子表单 onChange
export function onTableChange({ value, extra }) {
const { formGroupId, fieldId, from, changes = {}, tableFieldId } = extra || {};
// 必须,避免使用 updateItemValue 更新子表数据后,再次触发 onChange 陷入死循环
if (from === 'setItemValue') { return };
const tableField = this.$(tableFieldId);
// 上述代码必须存在,否则会造成功能异常
// 子表单数值
if (fieldId && fieldId === 'numberField_lbncqnrz') {
const sum = value.reduce((prev, cur) => {
return prev + (cur.numberField_lbncqnrz || 0);
}, 0);
this.$('numberField_lbncqns0').setValue(sum);
};
// 子表单成员1(单选模式)
if (fieldId && fieldId === 'employeeField_lbbn2hsb') {
const users1 = value.filter((item) => {
return !_.isEmpty(item.employeeField_lbbn2hsb || {});
}).map((_item) => {
return Array.isArray(_item.employeeField_lbbn2hsb) ? _item.employeeField_lbbn2hsb[0] : _item.employeeField_lbbn2hsb
});
this.$('employeeField_lbbn2hsd').setValue(_.uniqBy(users1, 'value'));
};
// 子表单成员2(多选模式)
if (fieldId && fieldId === 'employeeField_li018dw5') {
const employeeData = value.filter((item) => {
return !_.isEmpty(item.employeeField_li018dw5 || []);
});
const users2 = [];
for (let i = 0; i < employeeData.length; i++) {
for (let j = 0; j < employeeData[i].employeeField_li018dw5.length; j++) {
users2.push(employeeData[i].employeeField_li018dw5[j])
}
};
this.$('employeeField_li018dwa').setValue(_.uniqBy(users2, 'value'));
};
}
// 子表单删除
export function onTableDelClick(groupId, removedItem) {
const tableValue = this.$('tableField_lbbn2hs8').getValue();
// 子表单数值
const sum = tableValue.reduce((prev, cur) => {
return prev + (cur.numberField_lbncqnrz || 0);
}, 0);
this.$('numberField_lbncqns0').setValue(sum);
// 子表单成员1(单选模式)
const users1 = tableValue.filter((item) => {
return !_.isEmpty(item.employeeField_lbbn2hsb || {});
}).map(_item => {
return Array.isArray(_item.employeeField_lbbn2hsb) ? _item.employeeField_lbbn2hsb[0] : _item.employeeField_lbbn2hsb
});
this.$('employeeField_lbbn2hsd').setValue(_.uniqBy(users1, 'value'));
// 子表单成员2(多选模式)
const employeeData = tableValue.filter(item => {
return !_.isEmpty(item.employeeField_li018dw5 || []);
});
const users2 = [];
for (let i = 0; i < employeeData.length; i++) {
for (let j = 0; j < employeeData[i].employeeField_li018dw5.length; j++) {
users2.push(employeeData[i].employeeField_li018dw5[j])
}
};
this.$('employeeField_li018dwa').setValue(_.uniqBy(users2, 'value'));
}
其中数值求和也可以使用公式,如下所示:
{"text":"SUM(子表单.数值)","marks":[{"from":{"line":0,"ch":4,"sticky":null},"to":{"line":0,"ch":12,"sticky":null},"value":"numberField_lbncqnrz","invalid":false}],"isCmData":true}
3. 实现效果
4. 在线试玩
本文档对您是否有帮助?