跳到主要内容

表单中获取子表单的值赋值给当前主表单

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. 在线试玩

Copyright © 2024钉钉(中国)信息技术有限公司和/或其关联公司浙ICP备18037475号-4