LayUi- 动态表格table中下拉框Select的设置和监听

LayUi中动态表格中可以使用 templet自定义列模板 对单元格添加其他元素 ,添加下拉框相对麻烦些,没有自带的。

 

1.添加编辑器 

我们使用绑定模版选择器的方法:

在table.render()中 指定列(cols)的templet属性,并添加模板的html代码,例如:

 

 

 

{ rowspan: 2, title: '新建及改造工作状态', templet: '#editState' }
    <script type="text/html" id="editState" >
        <select name="editStateS" lay-filter="editStateS" id="editStateS"  data-value = {{d.NewReformStatus}} >  
            <option value="未开工">未开工</option>
            <option value="在建">在建</option>
            <option value="完工">完工</option>
            <option value="已验收">已验收</option>
        </select>
    </script>

(使用d.fileName指定字段,用于绑定已有的值; 另外必须设置lay-filter才可以进行监听)。

添加后样式不对,需要自己调整一下样式使得下拉框与单元格cell刚好合适嵌入,并且需要设置超出长宽时也显示,否则下拉时不会显示:

        td .layui-form-select {
            margin-top: -10px;
            margin-left: -15px;
            margin-right: -15px;
        }
        .layui-table-cell {
            overflow: visible !important;
        }

因为设置了全局的.layui-table-cell,会影响到其他table元素,比如表头的th,我这里表头原本是自适应宽度、超出隐藏,手动拖动调整宽度的,所以再重设一下表头超出隐藏:

        .layui-table-view .layui-table th{
            overflow:hidden;
        }

2.监听下拉框

因为下拉框是属于form元素,不是属于table元素,所以监听方法需要放在layui.use('form')中,而不是放在layui.use('table')中

layui.use('form', function () {
            var form = layui.form;
            //监听下拉框编辑
            form.on('select(editStateS)', function (data) {
                //获取当前行tr对象
                var elem = data.othis.parents('tr');
                //第一列的值是Guid,取guid来判断
                var Guid= elem.first().find('td').eq(1).text();
                //选择的select对象值;
                var selectValue = data.value;
                //这里的JsonDataInti是我自定义的table中数据的缓存数据,下拉数据修改时赋值到这一行缓存数据
                for (i = 0; i < jsonDataInit.length; i++) {
                    if (jsonDataInit[i].Guid== Guid) {
                        jsonDataInit[i].NewReformStatus = selectValue; //更新被修改的行数据
                    }
                }
            })
        });

 

3.已经存在的数据绑定至下拉框:

这里就又需要放在layui.use('table')中了,在table.render的done函数中来编写绑定逻辑:

done: function (res, curr, count) {
                                res.data.forEach(function (item, index) {//根据已有的值回填下拉框
                                layui.each($("select[name='editStateS']", ""), function (index, item) {
                                    var elem = $(item);
                                    elem.next().children().children()[0].defaultValue = elem.data('value');
                                    //elem.val(elem.data('value'));
                                });
                                table.render('select');
                            }

网上看了一些做法是使用elem.val(elem.data('value')); 来进行赋值,但是试了发现并不行,于是查看了一下生成的html代码:

 

 

 不知为何生成了两个,,一个select标签、一个input标签,页面显示的是input标签的内容。所有我这里改成了修改input中的内容,使用elem.next().children().children()[0].defaultValue = elem.data('value');来进行赋值。

完成的效果:

 

posted @ 2020-09-01 12:09  陈鹏昱Chen  阅读(24920)  评论(6编辑  收藏  举报