开发者社区> 问答> 正文

如何实现在主表单行文本中连续扫码,然后在子表单中自动新增明细

image.png

如图所示,我在扫码入口直接扫码,然后自动把扫码值填充到子表单中,然后子表单新增一行,同时清空扫码入口的值。等待下一次扫码。这个需求符合批量扫码的场景,不知道哪位大神能提供一个示例代码供我参考一下,万分感谢。

展开
收起
1335216255635508 2024-08-08 19:15:16 139 0
来自:钉钉宜搭
3 条回答
写回答
取消 提交回答
  • 若问题得到了解决,辛苦点下采纳回答哦~

    扫码入口组件绑定onchange事件如下:

    export function onChange({ value, actionType }) {
      if (this.state.debounceTimer) {
        clearTimeout(this.state.debounceTimer);
      }
      const debounceTimer = setTimeout(() => {
        // console.log('有防抖', value);
        if (actionType != "setValue") {
          const tableField = this.$("tableField_m3ije1eo");//需替换成子表单的唯一标识
          // 获取表格字段中的所有行数据
          let tableData = tableField.getValue();
          // 获取最后一行数据
          let lastRowIndex = tableData.length > 0 ? tableData.length - 1 : null;
          const lastRow = tableData.length > 0 ? tableData[tableData.length - 1] : null;
          // 判断最后一行是否为空
          // let isLastRowEmpty = lastRow && !Object.values(lastRow).some(val => val !== "");
          //判断最后一行的条码单行文本是否为空
          if (lastRow.textField_m3ije1ep=='') {
            // console.log(`The last row is empty.`);
            lastRow["textField_m3ije1ep"] = value;//需替换成子表单内单行文本的唯一标识
            // 更新最后一行数据
            tableData[lastRowIndex] = lastRow;
          }
          else {
            // 创建一个新行
            let newRow = {
              "textField_m3ije1ep": value, // 新行中的字段,赋值给它
            };
            tableData.push(newRow); // 将新行添加到表格数据中
          }
          // 更新整个表格字段
          tableField.setValue(tableData);
        }
        this.setState({
          debounceTimer: null,
        });
      },1500);
      this.setState({
        debounceTimer,
      });
    }
    

    子表绑定onchange事件:

    export function onChange2({ value, extra }){
      //将扫码入口的单行文本组件赋空
      this.$("textField_m3idjl8t").setValue("");
    }
    

    数据源变量配置如图:
    image.png

    2024-11-25 09:58:50
    赞同 3 展开评论 打赏
  • image.png

    已找到解决方案,只需在主表的单行文本中绑定onChange动作,然后用以下代码可以实现,供大家参考。

    /**
    * textField onChange
    * @param value 当前值
    */
    export function onChange({ value, actionType }) {
    
      // 避免给扫码入口置空时又触发了change事件中的代码
      if (actionType != "setValue") {
    
        var tableField = this.$("tableField_lzjjuun1");//需替换成子表单的唯一标识
    
        // 获取表格字段中的所有行数据
        var tableData = tableField.getValue();
    
        // 获取最后一行数据
        var lastRowIndex = tableData.length > 0 ? tableData.length - 1 : null;
        var lastRow = tableData.length > 0 ? tableData[tableData.length - 1] : null;
    
        // 判断最后一行是否为空
        var isLastRowEmpty = lastRow && !Object.values(lastRow).some(val => val !== "");
    
        if (isLastRowEmpty) {
          console.log(`The last row is empty.`);
          lastRow["textField_lzjjuun3"] = value;//需替换成子表单内单行文本的唯一标识
    
          // 更新最后一行数据
          tableData[lastRowIndex] = lastRow;
        }
        else {
          console.log(`The last row is not empty.`);
    
          // 创建一个新行
          var newRow = {
            "textField_lzjjuun3": value, // 新行中的字段,赋值给它
          };
          tableData.push(newRow); // 将新行添加到表格数据中
        }
    
        // 更新整个表格字段
        tableField.setValue(tableData); 
    
        // 手机可能会比较卡,延迟清空操作,以保障成功
        setTimeout(() => {
          this.$("textField_lzjjuun0").setValue("");//需替换成主表单行文本的唯一标识
          console.log(`textField_lzjjuun0 has been cleared.`);
        }, 100); // 延迟100毫秒(可以根据需要调整)
      }
    }
    
    2024-08-09 15:18:36
    赞同 5 展开评论 打赏
  • 若问题得到了解决,辛苦点下采纳回答哦~

    您好,可以参考以下思路实现:
    1.给子表单组件绑定添加一项的事件,在事件中,将刚刚新增一项的空行标识存储到变量中。且清空扫码入口组件的值
    2.扫码入口组件绑定change改变事件,在事件中根据刚刚存储的空行标识更新子表单内对应行的条码组件
    代码示例截图:
    image.png
    代码示例:

     // 避免给扫码入口置空时又触发了change事件中的代码
      if (actionType !="setValue"){
        var tableField = this.$("tableField_lzlcisup")//需替换成子表单的唯一标识
        var groupId = this.state.newGroupId //获取刚刚存储的空行标识
        if (groupId){
          tableField.updateItemValue(groupId, {
            'textField_lzlcisuq': value, // 更新子表条码,需替换成条码的唯一标识
          });
        }else{
          this.$("tableField_lzlcisup").setValue([{"textField_lzlcisuq":value}])
        }
    
      }
    
    --------------------------------------------
    // 将扫码入口组件置空
      this.$("textField_lzlcisuo").setValue("")//需替换成扫码入口的唯一标识
      // 将刚刚新增的子表空行标识存储到变量中
      this.setState({
        newGroupId
      })
    
    2024-08-08 23:21:35
    赞同 7 展开评论 打赏
问答分类:
问答地址:
来源圈子
更多
收录在圈子:
+ 订阅
「宜搭」是云钉原生低代码平台(钉钉 PaaS - aPaaS),让企业应用搭建更简单! 帮助中小企业降本提效,加强组织的数字化自主权; 帮助大型企业释放个体创新力,助力组织创新涌现。
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载