layui tree +table 实现点击左侧树,动态新增编辑行 (layui-v2.5.6)

 

 

 

 

 

 

样式代码,防止下拉框的下拉列表被隐藏---必须设置--- 此样式和表格的样式有冲突 如果表格列数太多 会出现错乱的情况

 1   /* 防止下拉框的下拉列表被隐藏---必须设置--- 此样式和表格的样式有冲突 如果表格列数太多 会出现错乱的情况 目前我的解决方法是忽略下拉框的美化渲染 <select lay-ignore> */
 2     .layui-table-cell {
 3         overflow: visible;
 4     }
 5 
 6     .layui-table-box {
 7         overflow: visible;
 8     }
 9 
10     .layui-table-body {
11         overflow: visible;
12     }
13     /* 设置下拉框的高度与表格单元相同 */
14     td .layui-form-select{
15         margin-top: -10px;
16         margin-left: -15px;
17         margin-right: -15px;
18     }
View Code

 

页面代码显示列

<form class="layui-form" id="fromId" action="#">

<div id="tree1" style="margin:20px 10px;">
<table id="demo" lay-filter="tableFilter"></table>
 
 </form>
// 如果将button 放入form 中,点击按钮执行函数后,会自动刷新当前页面  
 <button class="layui-btn" onclick="save();">保存</button>
 <button class="layui-btn" onclick="Application();">应用</button>

模板html   ,{{# layui.each(tableColumnList, function(index, item){  }} 该方法是执行js 操作

<script type="text/html" id="bar">
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>

//tableColumnList 是js 从后台获取的json 数据。
<script type="text/html" id="selectTool">
    <select name="selectDemo" lay-filter="selectDemo">
        <option value="">请选择或输入</option>
        {{# layui.each(tableColumnList, function(index, item){ }}
        <option value="{{item.COLUMN_NAME}}">{{ item.COLUMN_NAME }}</option>
        {{# }); }}
    </select>
</script>

 

js 渲染layui + 请求数据操作

  1 <script type="text/javascript">
  2     // 获取的是下拉框的数据,这种方法可能会有隐患
  3     var tableColumnList = @Html.Raw(ViewBag.ColumnList);
  4     var myajaxData = [];   // table + 选中的数据  全局数组对象
  5 
  6     // layui 渲染,执行,监听
  7     layui.use(['tree', 'util', 'table', 'form', 'jquery'], function () {
  8 
  9         var CONFIG_LINKED_DATA = {
 10             ID: '1001',
 11             DATA_ITEM_ID: '',
 12             DATA_ITEM_NAME: '',
 13             DATA_TABLE: '',
 14             ID_NUMBER_FIELD: '',
 15             FOREIGN_KEY_FIELD: '',
 16             SET_TIME: ''
 17         };
 18         var tree = layui.tree
 19         , layer = layui.layer
 20         , util = layui.util
 21         , table = layui.table
 22         , form = layui.form
 23           , $ = layui.jquery;
 24         var tableObj = table.render({
 25             elem: '#demo' //指定原始表格元素选择器(推荐id选择器)
 26             //, height: 315 //容器高度
 27             //, data: dataTable.data
 28             //, toolbar: '#toolbarDemo'
 29            , defaultToolbar: []
 30            , cols: [[
 31                //{ field: 'ID', title: 'ID', sort: true, fixed: 'left' } 
 32                , { field: 'DATA_ITEM_NAME', title: '数据项名称',width:'15%', edit: 'text' }
 33                , { field: 'DATA_TABLE', title: '数据源表',width:'22%', edit: 'text' }
 34                , { title: '人口信息',width:'15%', templet: function (d) { return 'TAB_PERSON' } }
 35                , { field: 'ID_NUMBER_FIELD',width:'20%', title: '身份证字段', templet: '#selectTool' }
 36                , { field: 'FOREIGN_KEY_FIELD',width:'20%', title: 'person字段' , templet: '#selectTool'}
 37                , { title: '操作', toolbar: '#bar', fixed: 'right', align: 'center' }
 38            ]]
 39            , text: {
 40                none: '暂无相关数据' //默认:无数据。注:该属性为 layui 2.2.5 开始新增
 41            }
 42             //,ID:"demo1"
 43             //,data:myajaxData
 44             //, url: 'url' // 我发现如果直接写上url 配置的话,就没法动态添加行 。所以选择先用ajax方法请求数据回来,再渲染table.reload({data:myajaxData})数据
 45              , done: function (res, curr, count) {
 46                  //debugger;
 47                  myajaxData = res.data;
 48                  //如果是异步请求数据方式,res即为你接口返回的信息。
 49 
 50                  //这里是表格重载的时候 回显下拉框的数据
 51                  $('tr').each(function(e){
 52                      var $cr=$(this); // 获取当前行的所有元素
 53                      //var dataIndex = $cr.attr("data-index");
 54 
 55                      var dataIndex = $cr.attr("data-index");
 56 
 57                      $.each(myajaxData,function(index,value){
 58 
 59                          if(value.LAY_TABLE_INDEX==dataIndex){
 60       
 61 $cr.find("td").eq(3).find('input').val(value.ID_NUMBER_FIELD);
 62                              $cr.find("td").eq(4).find('input').val(value.FOREIGN_KEY_FIELD);
 63                          }
 64 
 65                      });
 66                  });
 67 
 68              }
 69         });
 70         LoadInfo1();   //获取table 数据并渲染
 71         
 72         var  treeIns = tree.render({
 73             elem: '#tree1'
 74            , data: LoadInfo()
 75            , showCheckbox: true  //是否显示复选框
 76            , id: 'demoId1'
 77             //, isJump: true //是否允许点击节点时弹出新窗口跳转
 78            ,oncheck: function (obj) {
 79                //console.log(JSON.stringify(obj.data)); //得到当前点击的节点数据
 80                 //选中当前的节点数据,如果数据在table 数组对象中存在就不需要,push 新数据
 81                 if (obj.checked == true) {
 82                  
 83                     var treecheckeddata = obj.data;
 84                     var linked_data={};
 85 
 86                     linked_data.DATA_ITEM_ID = treecheckeddata.id;
 87                     linked_data.DATA_ITEM_NAME = treecheckeddata.title;
 88                     linked_data.DATA_TABLE = treecheckeddata.attributes.datatable;
 89                          
 90                     //debugger
 91                     //var filter_linked_data =myajaxData.filter(function(element, index, self){
 92                     //    if(element.DATA_ITEM_ID ==  obj.data.id)
 93                     //        return element;
 94                     //});
 95 
 96                     var myData =[];
 97                     for (var i = 0; i < myajaxData.length; i++) {
 98                         if(myajaxData[i].DATA_ITEM_ID ==  obj.data.id)
 99                         {
100                             myData.push(myajaxData[i]);
101                         }
102                     }
103 
104                     if(myData.length == 0)
105                     {
106                         myajaxData.push(linked_data);
107                     }
108 
109                    
110                     linked_data = {}; // 重复勾选时,添加入新对象
111 
112                     tableObj.reload({
113                         data: myajaxData
114                     });
115                           
116                 }
117 
118            }
119         });
120 
121         function LoadInfo1() {
122             var jsonstr1 = '';
123             $.ajax({
124                 url: 'url',
125                 //data: { id: '1' },
126                 type: 'post',
127                 dataType: 'json',
128                 async: false,
129                 success: function (result) {
130                     //debugger;
131                     if (result) {
132                         jsonstr1 = result;
133                         myajaxData = jsonstr1.data;
134 
135                         tableObj.reload({ data: myajaxData });
136 
137                     }
138                 },
139                 error: function (xhr, status) { }
140             });
141 
142             return jsonstr1;
143         }
144 
145       // 监听下拉框的值
146         form.on('select(selectDemo)', function (data) {
147             // 通过data.elem.dataset可以得到保存的对象id
148             // data.elem.value可以得到下拉框选择的文本
149 
150             var select_value =data.elem.value;
151             var dataIndex =$(this).parents().parent('tr').attr("data-index");
152             var select_td_field =$(this).parents("td").attr("data-field");
153 
154             //选择下拉框的值,给全局变量myajaxData 赋值
155             $.each(myajaxData,function(index,value){
156 
157                 if(value.LAY_TABLE_INDEX == dataIndex && select_td_field == "ID_NUMBER_FIELD"){
158                     value.ID_NUMBER_FIELD = select_value;
159                 }
160                 if(value.LAY_TABLE_INDEX == dataIndex && select_td_field == "FOREIGN_KEY_FIELD"){
161                     value.FOREIGN_KEY_FIELD =select_value;
162                 }
163             });
164         })
165 
166         //监听删除事件
167         table.on('tool(tableFilter)', function (obj) {
168             if (obj.event === 'del') {
169                 obj.del();
170                 //console.log(obj.data.DATA_ITEM_ID);
171 
172                 //var tree_checked = obj.data.DATA_ITEM_ID;
173                 //var checkData = tree.getChecked('demoId1');
174                 //$.each(checkData,function(index,value){
175                 //    console.log(value);
176 
177                 //    if(value.id == tree_checked && value.children.length ==0)
178                 //    {
179                 //        value.checked =true;
180                 //    }else{
181                 //        $.each(value.children,function(item,value1){
182                 //            console.log("children",value1);
183                 //            if(value1.id == tree_checked)
184                 //            {
185                 //                value1.checked = false;
186                 //            }
187                 //        })
188                 //    }
189                 //})
190 
191                 //treeIns.reload({
192                 //    checked:checkData,
193                 //});
194 
195             };
196         });
197 
198 
199 
200         //提交数据到后台保存
201         //form.on('submit(*)', function (data) {
202         //    return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
203         //});
204 
205         //请求Tree 数据
206         function LoadInfo() {
207             var jsonstr = '';
208             $.ajax({
209                 url: 'url',
210                 //data: { id: '1' },
211                 //contentType: 'application/json;charset=utf-8',
212                 type: 'post',
213                 dataType: 'json',
214                 async: false,
215                 success: function (result) {
216                     if (result) {
217                         jsonstr = result.Data;
218                     }
219                 },
220                 error: function (xhr, status) { }
221             });
222             return jsonstr;
223         }
224 
225         //根据有效表名,获取下拉菜单的数据
226         function LoadInfo2(tableName) {
227             tableName = tableName != null ? tableName : "TAB_PERSON";
228             $.ajax({
229                 url: 'url',
230                 data: { tableName: tableName },
231                 //contentType: 'application/json;charset=utf-8',
232                 type: 'post',
233                 dataType: 'json',
234                 async: false,
235                 success: function (result) {
236                     if (result) {
237                         tableColumnList = result.Data;
238                     }
239                 },
240                 error: function (xhr, status) { }
241             });
242 
243             return tableColumnList;
244         }
245 
246     });
247 
248 
249     function save()
250     {
251         //console.log("提交myajaxData数据",JSON.stringify(myajaxData));
252         //删除数组对象中的空[]    ,[[],{},{name:'',sex:''}]   如果是{},=>JSON.stringify(arr[i]) == "{}"
253         for (var i = 0; i < myajaxData.length; i++) {
254             //这里面前两个判断条件只针对普通数组
255             if (myajaxData[i] == null || myajaxData[i] == "") {
256                 myajaxData.splice(i, 1);
257                 i = i - 1;
258             }
259         }
260         //console.log(JSON.stringify(myajaxData));
261         $.ajax({
262             url:"/ComprehensiveDataCorrelation/Save_ICONFIG_LINKED_DATA",
263             // async:false,
264             type:"post",
265             //dataType:"json",
266             contentType: "application/json",//向后台传送格式
267             data:JSON.stringify({ model:myajaxData}),
268             success:function(result){
269 
270                 if(result.Success){
271                     layer.msg('保存成功!');
272                     //window.location.href="/ComprehensiveDataCorrelation/DataCorrelationIndex";
273                 }else{
274                     layer.msg(result.msg);
275                 }
276             }
277         });
278     }
279 
280     function Application() {
281         $.ajax({
282             url: '/ComprehensiveDataCorrelation/ToolApplication',
283             data: { toolType: "link" },
284             type: 'post',
285             dataType: 'json',
286             success: function (result) {
287                 if (result) {
288                     layer.msg("操作成功!");
289                 } else {
290                     layer.msg("操作失败!");
291                 }
292             },
293             error: function (xhr, status) { }
294         });
295     }
296 </script>
297     

 

参考资料: layui 新增编辑行  layui 官方文档

 

posted @ 2020-12-03 10:49  健身编程Dog  阅读(2233)  评论(0编辑  收藏  举报