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
})
}难点解析
当点击选中下拉框之后需要更新当前行,但是经过测试,使用datagrid的onclickrow或者是onclickcell均不起作用,原因就是我们点击的是单元格中的元素
解决思路
1、通过f12中查看dom结构,然后获取到原本datagrid的td元素;
2、通过td的点击事件结合datagrid的selectoncheck:true,checkonselect:true 使得编辑的行选中
3、通过选中行数据selected结合datagrid 的getrowindex方法获取到编辑行索引index
4、通过index更新当前行数据
实现中的问题
在执行步骤4的时候发现,如果是使用insertrow方式,会在页面中停留一个下拉选面板异常

这里的原因就是。当我们选中之后,执行了更新行,再次之前没有执行编辑器editor的结束,导致此错误;
解决方案有2种
先结束editor的编辑,然后在更新
dg.datagrid(‘endedit’, rowindex);
dg.datagrid(‘updaterow’,{
index:rowindex,
row:row
});
直接删除当前行,然后在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)" rel="external nofollow" 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);以上希望能对大家有所帮助;如果大家有更好的办法欢迎留言讨论
到此这篇关于easyui弹出框行编辑,通过下拉框实现内容联动的文章就介绍到这了,更多相关easyui下拉框内容联动内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论