ruoyi--主子表提交(新增行)--select选项动态绑定问题

ruoyi–主子表提交(新增行)–select选项动态绑定问题

问题描述

在主子表提交中,将select选项动态绑定后台数据,新增行时之前的选择都被刷新.解决方法在最后.记录一下过程,[自用]

select动态绑定

用ruoyi框架的时候,使用模板中的提交主子表,当select作为表格的元素时,原模板中产生迷惑的代码如下:
表格初始化部分:

 {
  field: 'type',
       align: 'center',
       title: '商品种类',
       formatter: function(value, row, index) {
   		var data = [{ index: index, type: value }];
           return $("#goodsTypeTpl").tmpl(data).html();
             }
   }

js部分 :

<!-- 商品类型 -->
<script id="goodsTypeTpl" type="text/x-jquery-tmpl">
<div>
<select class='form-control' name='goods[${index}].type'>
  <option value="">所有</option>
  <option value="0" {{if type==="0"}}selected{{/if}}>寒性</option>
  <option value="1" {{if type==="1"}}selected{{/if}}>热性</option>
</select>
</div>
</script>

很明显每项都写死了,不符合选项用后台数据进行动态渲染的需求;
将方法改成动态渲染后,代码如下:

<script id="goodsTypeTpl" type="text/x-jquery-tmpl">
<div>
<select class='form-control projectName' name='beans[index].projectName'>
    <option value=""></option>
    <option th:each="project:${projects}" th:value="${project.itemName}" th:text="${project.itemName}" }" ></option>
</select>
</div>
</script>

发现selected的判断如何处理是个问题.js代码块,使用了jquery-tmpl(一个模板工具(个人理解)),看了眼语法,觉得略头大,且要处理数据格式,有那么亿点点麻烦,一瞬间不想动
这个问题不处理,每次新增行就会出现之前的选择被刷新的问题

bootstrap-table 的问题,以及ruoyi的处理

挖了一下ruoyi的common.js,顺路往下看了眼bootstrap-table.min.js,发现本质是bootstrap-table新增行会处理掉之前行的数据,但是ruoyi在做新增行的时候已经对bootstrap-table进行过处理包装,用过的会发现,input的文本数据在新增的时候并没有被刷掉,也就是说ruoyi已经处理了bootstrap-table的缺陷,代码放过来,有时间可以再看一下

// 主子表操作封装处理
var sub = {
//获取已有的数据,调用bootstrap-table的updateRow(),在新增完行之后再将之前的数据渲染进去(个人理解
    editColumn : function() {
	var dataColumns = [];
	for (var columnIndex = 0; columnIndex < table.options.columns.length; columnIndex++) {
	    if (table.options.columns[columnIndex].visible != false) {
		dataColumns.push(table.options.columns[columnIndex]);
	    }
	}
	var params = new Array();
	var data = $("#" + table.options.id).bootstrapTable('getData');
	var count = data.length;
	for (var dataIndex = 0; dataIndex < count; dataIndex++) {
	    var columns = $('#' + table.options.id + ' tr[data-index="'
		    + dataIndex + '"] td');
	    var obj = new Object();
	    for (var i = 0; i < columns.length; i++) {
		var inputValue = $(columns[i]).find('input');
		var selectValue = $(columns[i]).find('select');
		var key = dataColumns[i].field;
		if ($.common.isNotEmpty(inputValue.val())) {
		    obj[key] = inputValue.val();
		} else if ($.common.isNotEmpty(selectValue.val())) {
		    obj[key] = selectValue.val();
		} else {
		    obj[key] = "";
		}
	    }
	    var item = data[dataIndex];
	    var extendObj = $.extend({}, item, obj);
	    params.push({
		index : dataIndex,
		row : extendObj
	    });
	}
	$("#" + table.options.id).bootstrapTable("updateRow", params);
    },
    delColumn : function(column) {
	sub.editColumn();
	var subColumn = $.common.isEmpty(column) ? "index" : column;
	var ids = $.table.selectColumns(subColumn);
	if (ids.length == 0) {
	    $.modal.alertWarning("请至少选择一条记录");
	    return;
	}
	$("#" + table.options.id).bootstrapTable('remove', {
	    field : subColumn,
	    values : ids
	});
    },
    //新增行
    addColumn : function(row, tableId) {
	var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
	table.set(currentId);
	var count = $("#" + currentId).bootstrapTable('getData').length;
	//
	sub.editColumn();
	//bootstrapTable的insertRow会把之前的数据cover掉,因为没有存储,还是什么,具体可以看下🔗1
	$("#" + currentId).bootstrapTable('insertRow', {
	    index : count + 1,
	    row : row
	});
    }
};

换个思路看一下

所以为什么还有select选择被清空的问题存在,目前唯一存疑的就是之前那段要用jquery-tmpl的代码.本质上,这个模板是用来在新增行的时候将html代码填充进去,那不用这个方法,我们换ruoyi(可能是ruoyi ,不过好像有好多table初始化的代码长得差不多…所以大概率是其他的,俺还不清楚,没有深究)中另一种返回方式,代码如下:

{
 field: 'price',
      align: 'center',
      title: '商品价格',
      formatter: function(value, row, index) {
      	var html = $.common.sprintf("<input class='form-control' type='text' name='goods[%s].price' value='%s'>", index, value);
  		return html;
            }
},

在foramtter中可以通过value接收到上一行的选择结果,index就是行号,对此进行处理,可以实现需求.

解决方法

js – 表格初始部分代码

{
		            field: 'projectName',
		            align: 'center',
		            title: '考核内容',
		            formatter: function(value, row, index) {
		            	//处理option
                    	var headOption = "<option value =''>请选择</option>";
                    	 $.each(project,function(i,obj){
                     		if(value == obj.itemName){
                     			headOption = headOption + "<option value='"+ obj.itemName +"' selected>"+obj.itemName+"</option>";
                     		}else{
                     			headOption = headOption + "<option value='"+ obj.itemName +"'>"+obj.itemName+"</option>";
                     		}
                     		option = '<select class="form-control" name="beans['+ index + '].projectName">'+
                            headOption + '</select>' ;
             	        });
		            	return $.common.sprintf(option, index, value);
                    }
		        },

js – addColumn() "添加行"function

 function addColumn() {
        	var row = {
        			projectContent: "",
        			projectSetScore: "",
        			projectName: "",
            }
       		sub.addColumn(row);
        }

html部分代码

<div class="row">
				<div class="col-sm-12">
					<button type="button" class="btn btn-white btn-sm"
						onclick="addColumn()">
						<i class="fa fa-plus"> 增加</i>
					</button>
					<button type="button" class="btn btn-white btn-sm"
						onclick="sub.delColumn()">
						<i class="fa fa-minus"> 删除</i>
					</button>
					<div class="col-sm-12 select-table table-striped">
						<table id="bootstrap-table"></table>
					</div>
				</div>
			</div>

总结

其实最后一步,我还是有点懵的,但是,可以用,嗯~可以.
昨天临近中午遇到这个问题,现在误打误撞解决了(大概,话比较多记录下过程,留个记录给自己看,其中有很多是我目前的认知,如果有问题,请走过路过的大佬们不吝赐教🙏
2021-09-02 13:52

链接: 🔗1. bootstrap table新增编辑行时上一行填写的数据被清空.

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
RuoYi若依管理系统是一个基于SpringBoot的权限管理系统,代码易读易懂、界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运即可用。 RuoYi若依管理系统功能: 1、用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2、部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持权限。 3、岗位管理:配置系统用户所属担任职务。 4、菜单管理:配置系统菜单,操作权限,按钮权限标识等。 5、角色管理:角色菜单权限分配、设置角色按机构进数据范围权限划分。 6、字典管理:对系统中经常使用的一些较为固定的数据进维护。 7、参数管理:对系统动态配置常用参数。 8、通知公告:系统通知公告信息发布维护。 9、操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 10、登录日志:系统登录日志记录查询包含登录异常。 11、在线用户:当前系统中活跃用户状态监控。 12、定时任务:在线(添加、修改、删除)任务调度包含执结果日志。 13、代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 14、系统接口:根据业务代码自动生成相关的api接口文档。 15、服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 16、在线构建器:拖动单元素生成相应的HTML代码。 17、连接池监视:监视当前系统数据库连接池状态,可进分析SQL找出系统性能瓶颈。   RuoYi若依管理系统 更新日志: v4.6.1 新增IE浏览器版本过低提示页面 新增详细信息tab页签方式 新增解锁屏幕打开上次页签 数据监控默认账户密码防止越权访问 新增格示例(导出选择列) 个人信息添加手机&邮箱重复验证 个人中心刷新后样式问题 操作日志返回参数添加非空验证 velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞 子模板默认日期格式化 代码生成预览语言根据后缀名高亮显示 代码生成主子相同字段导致数据问题 升级SpringBoot到最新版本2.2.13 升级shiro到最新版1.7.1 阻止身份认证绕过漏洞 升级bootstrapTable到最新版本v1.18.2 升级bootstrapTable相关组件到最新版本v1.18.2 升级fastjson到最新版1.2.75 升级druid到最新版本v1.2.4 升级oshi到最新版本v5.6.0 修改ip字段长度防止ipv6地址长度不够 搜索建议示例选择后隐藏列 主子示例增加初始化数据 优化Excel导入增加空判断 修复横向菜单无法打开页签问题 修复导入数据为负浮点数时,导入结果会丢失精度问题 优化更多操作按钮左侧移入内容闪现消失情况 修复主子提交中列隐藏后出现列偏移问题 单据打印网页时通过hidden-print隐藏元素 格销毁清除记住选择数据 增加格动态列示例 代码生成选择主子关联元素必填 tree根据Id和Name选中指定节点增加空判断 其他细节优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值