当前位置: 首页 > article >正文

EasyUI弹出框行编辑,通过下拉框实现内容联动

EasyUI弹出框行编辑,通过下拉框实现内容联动

需求

实现用户支付方式配置,当弹出框加载出来的时候,显示用户现有的支付方式,datagrid的第一列为conbobox,下来选择之后实现后面的数据直接填充;
在这里插入图片描述
点击新增:新增一个空白行
选择结算条款编码:后面的结算方式等信息自动带出来
点击删除:此行删除

实现

html代码(只列举弹出框部分)

<div class="easyui-dialog" id="configDialog" title="客户条款配置" style="width: 800px;height:400px; padding:2px 2px;" data-options="
            iconCls:'icon-save',
            closed : true,
            modal: true,
            maximizable:true,
            onResize:function(){
                $(this).dialog('center');
            },
            buttons: [{
                text:'保存',
                iconCls:'icon-ok',
                handler:function(){
                    alert('ok');
                }
            },{
                text:'取消',
                iconCls:'icon-no',
                handler:function(){
                     $('#configDialog').dialog('close');
                }
            }]
            ">

    <div>
        <table style="width:100%;height:322px;" id="configTable" class="easyui-datagrid"
               data-options="singleSelect:true,selectOnCheck:true,checkOnSelect:true,fit:false,striped:false,autoRowHeight:false,pagination:false,
               toolbar: [{
                    text:'新增',
                    iconCls:'icon-add',
                    handler:function(){
                        appendRow();
                    }
                }]
         ">
            <thead>
                <tr>
                    <th field="id" checkbox="true"></th>
                    <th data-options="field:'code',editor:{
                        type:'combobox',
                        options:{
                            valueField:'id',
                            textField:'code',
                            url:'${ctx}/json/PoPaymentJsonController/getAllTipsList',
                            onSelect: refreshRow
                            }
                        }" width="150" >结算条款编码</th>
                    <th data-options="field:'settlementTypeName'" width="150" >结算方式</th>
                    <th data-options="field:'startTypeName'" width="150" >结算起始日期</th>
                    <th data-options="field:'period'" width="150" >结算天数</th>
                    <th data-options="field:'remark'" width="100" formatter="detailFormatter">操作</th>
                </tr>
            </thead>
        </table>
    </div>
</div>

JS代码


	<%-- 配置 --%>
    function config(index){
        const row = $('#dg').datagrid('getRows')[index]
        const queryParams = {id:row.id}
        $("#configTable").datagrid({
            url : '${ctx}/json/PoPaymentJsonController/queryCustomerPaymentConfigMap',
            queryParams : queryParams
        });
        $('#configDialog').dialog('open')
    }
    
    <%-- 添加一行 --%>
    function appendRow(){
        let dg = $('#configTable');
        dg.datagrid('appendRow',{code:'',settlementTypeCode:'',startTypeCode:'',period:''});

        // 获取新增的行的索引
        let index = dg.datagrid('getRows').length - 1;
        dg.datagrid('beginEdit', index);

    }

    <%-- 删除一行 --%>
    function deleteRow(index){
        let dg = $('#configTable');
        let row = dg.datagrid('getRows')[index];
        if(row.id){
            deleteRows.push(row)
        }
        dg.datagrid('deleteRow', index);
    }

    <%-- 填充行 --%>
    function refreshRow(row){
        console.log('row',row);
        // 使用closest方法向上查找最近的td元素
        let $table = $(this).closest('table');

        // 获取td
        let $td = $table.closest('td');
        $td.click();
        const dg = $('#configTable');
        const selected = dg.datagrid('getSelected');
        const rowIndex = dg.datagrid('getRowIndex',selected);
        // dg.datagrid('endEdit', rowIndex);
        // dg.datagrid('updateRow',{
        //     index:rowIndex,
        //     row:row
        // });

        dg.datagrid('deleteRow',rowIndex);
        dg.datagrid('insertRow',{
            index:rowIndex,
            row:row
        })

    }

难点解析

当点击选中下拉框之后需要更新当前行,但是经过测试,使用datagridonClickRow或者是onClickCell均不起作用,原因就是我们点击的是单元格中的元素

解决思路

1、通过F12中查看dom结构,然后获取到原本datagrid的td元素;
2、通过td的点击事件结合datagridselectOnCheck:true,checkOnSelect:true 使得编辑的行选中
3、通过选中行数据selected结合datagridgetRowIndex方法获取到编辑行索引index
4、通过index更新当前行数据

实现中的问题

在执行步骤4的时候发现,如果是使用insertRow方式,会在页面中停留一个下拉选面板异常
在这里插入图片描述
这里的原因就是。当我们选中之后,执行了更新行,再次之前没有执行编辑器editor的结束,导致此错误;
解决方案有2种

  1. 先结束editor的编辑,然后在更新

dg.datagrid(‘endEdit’, rowIndex);
dg.datagrid(‘updateRow’,{
index:rowIndex,
row:row
});

  1. 直接删除当前行,然后在insertRow

dg.datagrid(‘deleteRow’,rowIndex); dg.datagrid(‘insertRow’,{
index:rowIndex,
row:row })

看大家实际需要,第一种方式,因为我在refreshRow种调用了td的点击事件$td.click();,因此如果多行存在的话,每行都会被选中;所有都选中全选择没有打钩
在这里插入图片描述

第二中方式则一行都不会被选中,我采用的是第二种方式,大家可以根据需要实际需要选择。
在这里插入图片描述

第二个难点就是需要从当前选中的下拉框获取到编辑行,这里发现conbobox在datagrid中渲染的元素为

<td field="code">
	<div style="width: 149px;" class="datagrid-cell datagrid-cell-c4-code datagrid-editable">
		<table border="0" cellspacing="0" cellpadding="1">
			<tbody>
				<tr>
					<td>
						<input type="text" class="datagrid-editable-input combobox-f combo-f textbox-f" style="display: none;">
						<span class="textbox combo" style="width: 147px; height: 20px;">
							<span class="textbox-addon textbox-addon-right" style="right: 0px;">
								<a href="javascript:void(0)" class="textbox-icon combo-arrow" icon-index="0" style="width: 18px; height: 20px;"></a>
							</span>
							<input type="text" class="textbox-text validatebox-text" autocomplete="off" placeholder="" style="margin-left: 0px; margin-right: 18px; padding-top: 3px; padding-bottom: 3px; width: 121px;">
							<input type="hidden" class="textbox-value" name="" value="9">
						</span>
					</td>
				</tr>
			</tbody>
		</table>
	</div>
</td>

因此这里获取到td之后再执行点击事件
// 使用closest方法向上查找最近的td元素
let $table = $(this).closest('table');

// 获取td
let $td = $table.closest('td');
$td.click();
const dg = $('#configTable');
const selected = dg.datagrid('getSelected');

// 获取到当前行
const rowIndex = dg.datagrid('getRowIndex',selected);

以上希望能对大家有所帮助;如果大家有更好的办法欢迎留言讨论


http://www.kler.cn/a/387530.html

相关文章:

  • 2-UML概念模型测试
  • python识别ocr 图片和pdf文件
  • 智慧仓储物流可视化平台
  • 产品经理如何使用项目管理软件推进复杂项目按时上线
  • 2024AAAI | DiffRAW: 利用扩散模型从手机RAW图生成单反相机质量的RGB图像
  • FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
  • go生成4位随机数字
  • 深入了解决策树:机器学习中的经典算法
  • 如何使用HighBuilder前端开发神器
  • ThingsBoard规则链节点:RPC Call Reply节点详解
  • Python的函数
  • 第一部分 Supervised Machine Learning: Regression and Classification
  • 嵌入式系统与机器学习的结合
  • oracle使用CTE递归分解字符串
  • python - leetcode【数据结构-算法】-入门/通关手册
  • Rust移动开发:Rust在iOS端集成使用介绍
  • 搭子小程序定制开发:全新找搭子之旅
  • 计算机网络之物理层
  • Rust:启动与关闭线程
  • Java 中的 Supplier:让数据生成更灵活
  • 设计模式学习总结(一)
  • 【VScode】Html+Css+JavaScript学习计划表
  • 【论文阅读笔记】Mamba模型代码理解
  • 电子电气架构--- 实施基于以太网的安全车载网络
  • QCustomPlot添加自定义的图例,实现隐藏、删除功能(二)
  • Linux【基础篇】