bootstrap-Table sub父子表的使用

本文介绍如何在Spring Boot项目中实现BootstrapTable的父子表功能。文章详细解释了配置步骤及注意事项,包括引入必要的JS和CSS文件、初始化表格、处理子表数据加载等问题。

概述

今天项目里面要用到bootstrapTable里面的Sub Table也就是我们说的父子表,之前也没做过,so直接到官网找文档,卡的不行,算了只能网上百度找了几篇案例,也都是不全面。搞了一下午,终于有点效果。今天记录一下,加深印象,也给像我一样寻找案例的朋友一点思路。

环境:springboot+freemarker(jsp也是一样做法)

先看一下官网的效果图http://issues.wenzhixin.net.cn/bootstrap-table/#options/sub-table.html

本人最后效果

页面是丑了点,解决了需求就好。

开始第一步在页面中引入bootstrapTable的js和css文件
官方下载地址
https://github.com/wenzhixin/bootstrap-table/archive/develop.zip
<link href="${cp}plugins/bootstrap-table/bootstrap-table.css" rel="stylesheet" media="screen">
<script src="${cp}plugins/bootstrap-table/bootstrap-table.js" type="text/javascript"></script>
    <script src="${cp}plugins/bootstrap-table/bootstrap-table-zh-CN.js" charset="UTF-8" type="text/javascript"></script>

准备好后,我们在页面定义一个

<table id="table"></table>

然后在js中初始化表格
我们知道bootstrapTable初始化有两种方式,一种是通过table 的data-url属性在后台查询,二是页面加载后通过js直接加载数据,我们在父表中采用第一种通过url从后台查询出列表数据,子表数据我们通过ajax同步获取数据后在通过第二种方式初始化子表。这里其实是有个坑,有个坑,有个坑 ,重要的事情说三遍,之前这里折腾了几个小时,看网上案例都是采用第一种方式去加载父表和子表,我不知道他们有没有测试过,反正我是无法加载出子表数据。也就是说子表的数据是获取到了,但是无法展示到页面里。找了好久,最后怀疑是异步的原因,也就是说,bootstrapTable通过url获取数据后,没等数据加载,就把页面渲染了,最后我尝试先用ajax同步获取数据后,在初始化子表。子表里面数据就出来了。这可能真关系到加载顺序 ,这只是我个人结论,如果有另有高人知道这一原因,希望能及时指出。

下面我们在代码里走一遍吧


$(function() {
//先销毁表格,在初始化
    $('#table').bootstrapTable('destroy').bootstrapTable({
        columns: [{
            checkbox: true
        },
        {
            title: '列名一',
            field: 'id',
            align: 'center',
        },
        {
            title: '列名二',
            field: 'name',
            align: 'center',
            formatter: function(value, row, index) {
               //处理格式化数据
            }
        },
        {
            title: '添加时间',
            field: 'createDate',
            align: 'center',
        }],
        url: "user/list/",      //请求数据的地址URL
        method: 'post',  //请求方式(*)
        striped: true,  //是否显示行间隔色
        cache: false,  //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
        pagination: true,  //是否显示分页(*)
        sortable: true,  //是否启用排序
        sortOrder: "desc", //排序方式
        sidePagination: "server",  //分页方式:client客户端分页,server服务端分页(*)
        pageNumber: 1, //初始化加载第一页,默认第一页
        pageSize: 10,  //每页的记录行数(*)
        pageList: [20, 50, 100],  //可供选择的每页的行数(*)
        showColumns: false,  //是否显示所有的列
        showRefresh: false,  //是否显示刷新按钮
        minimumCountColumns: 2,  //最少允许的列数
        clickToSelect: true,   //是否启用点击选中行
        height: 800,
        detailView: true,  //是否显示父子表    *关键位置*
        queryParamsType: "limit",
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        checkboxHeader: true,
        search: false,
        singleSelect: true,
        striped: true,
        showColumns: true,  // 开启自定义列显示功能
        responseHandler: function responseHandler(sourceData) {
            //这里要做分页,所以对返回的数据进行了处理
            return {
                "total": sourceData.total,  // 总条数
                "rows": sourceData.rows // 返回的数据列表(后台返回一个list集合)
            };
        },
        queryParams: function queryParams(params) { 
            //设置查询参数,就是把页面需要查询的字段通过jquery取值后传到后台
            var param = {  
                id: $("input[name='id']").val(),
                name: $("input[name='name']").val(),
                pageSize: params.limit, // 页面大小
                pageNumber: (params.offset)/10+1 // 页码
            };
            return param;
        },
        //注册加载子表的事件。你可以理解为点击父表中+号时触发的事件
        onExpandRow: function(index, row, $detail) {
            //这一步就是相当于在当前点击列下新创建一个table
            var cur_table = $detail.html('<table></table>').find('table');
            var html = "";
            html += "<table class='table'>";
            html += "<thead>";
            html += "<tr style='height: 40px;'>";
            html += "<th>用户id</th>";
            html += "<th>用户姓名</th>";
            html += "</tr>";
            html += "</thead>";
            $.ajax({
                type: "post",
                url: "user/list",       //子表请求的地址
                data: {id:row.id,name:row.name},//我这里是点击父表后,传递父表列id和nama到后台查询子表数据
                async: false,           //很重要,这里要使用同步请求
                success: function(data) {
                    html += '<ul class="list-group" >';
                    //遍历子表数据
                    $.each(data.rows,
                    function(n, value) {
                        html += "<tr  align='center'>" 
                            + "<td>" + value.id + "</td>" 
                            + "<td>" + value.name + "</td>" 
                            + "</tr>";
                    });
                    html += '</table>';
                    $detail.html(html); // 关键地方
                }
            });
        },
    });
});

搞定,办法是笨了点,效果还是实现了。欢迎大家有更好办法的 交流交流!!

内容概要:本文围绕含虚拟惯量阻尼的大功率并网逆变器虚拟同步发电机(VSG)控制策略展开系统性研究,旨在提升大功率并网逆变器在复杂电网环境下的运行稳定性与动态响应能力。通过引入虚拟惯量与虚拟阻尼控制环节,赋予逆变器类似传统同步发电机的惯性与阻尼特性,从而有效增强其对频率波动的抑制能力和对有功、无功功率扰动的适应性。研究基于Simulink平台构建了完整的VSG控制系统仿真模型,集成了有功-频率(P-f)与无功-电压(Q-U)双下垂控制、虚拟惯量阻尼补偿、功率解耦控制及并网电流反馈等核心模块,并在负载突变、电网电压波动等多种工况下进行了仿真验证,充分展示了该控制策略在改善系统暂态性能、抑制频率振荡和提升并网鲁棒性方面的优越性。; 适合人群:具备电力电子、自动控制理论及新能源发电系统等相关基础知识的研究生、科研人员,以及从事并网逆变器、构网型变流器等产品研发的工程技术人员。; 使用场景及目标:①深入探究虚拟同步发电机(VSG)技术在大功率并网逆变器中的应用原理与实现方法;②掌握虚拟惯量与虚拟阻尼的物理意义、数学建模及其对电力系统稳定性的影响机制;③通过Simulink仿真手段验证VSG控制策略在电网扰动条件下的动态性能与抗干扰能力;④为构网型逆变器(Grid-Forming Inverter)的关键技术研发与工程实践提供理论依据和仿真支持。; 阅读建议:建议读者结合同步发电机基本运行原理与现代电力电子控制技术背景进行学习,重点理解VSG控制架构中各功能模块的协同工作机制与关键参数的整定方法,并推荐动手复现文中所述的Simulink仿真模型,以深入掌握控制逻辑设计与系统动态响应特性之间的内在联系。
内容概要 本资源是一套完整可运行的 Qt Widgets 批量图片压缩桌面工具源码,基于 Qt5/C++ 从零开发,专为初学者设计,分步实现图片批量处理全套功能。工具支持多选单张图片、直接读取整个文件夹内所有 JPG/PNG 图像,可自定义输出图片分辨率、调节 JPG0~100 区间压缩质量,自带锁定宽高比防拉伸变形功能;批量处理完成后自动统计每张图片压缩前后文件体积,计算整体压缩缩小比例,直观展示压缩效果。 适用人群 Qt/C++ 零基础初学者,学习 QImage 图像绘图、文件目录遍历、UI 交互开发; 需要本地批量处理图片的办公、设计、自媒体从业者; 想要学习图片缩放、JPG 压缩、本地文件 IO、进度条交互的开发学习者。 使用场景 自媒体批量压缩配图,降低图片体积节省上传流量; 摄影、设计批量统一图片尺寸,批量轻量化相册图片; 程序开发学习:QFileDialog 文件选择、QDir 文件夹遍历、QImage 缩放保存、QSlider 参数联动、批量循环界面防卡顿、文件大小格式化转换全套 Qt 图像开发实战案例。 工具核心功能清单 双模式导入图片:手动多选单张图片 / 一键读取整个文件夹全部图片; 自定义输出宽高分辨率,支持锁定原始宽高比,避免图片拉伸变形; 滑块调节 JPG 压缩质量 0~100,平衡图片清晰度与文件占用大小; 自定义输出保存目录,批量生成压缩后的图片文件; 实时进度条展示处理进度,循环中刷新界面,程序不会假死卡顿; 自动统计每张图片压缩前后体积,换算 KB/MB 直观展示; 批量完成弹窗汇总:图片总数、成功数量、单张大小对比、整体压缩节省空间比例; 完整模块化代码,功能拆分清晰,每段代码附带详细注释,新手可分步拆解学习。 其他说明 开发环境:Qt Creator + Qt5.15 MSVC,Windows 平台可直接编译运行; 源码结构清晰,功能
内容概要:本文围绕基于瞬态三角哈里斯鹰算法(TTHHO)实现多无人机协同集群在三维空间中的避障路径规划展开研究,提出一种以最低综合成本为目标的优化模型,综合考量路径长度、飞行高度、环境威胁等级及航段转弯角度等因素,有效提升路径的安全性与飞行效率。研究采用Matlab平台完成算法设计与仿真实验,验证了TTHHO算法在复杂动态环境下为多无人机系统规划出高质量、避障能力强的协同飞行路径的能力,展现了其在全局搜索能力和收敛性能方面的优势。该方法属于智能优化算法在无人系统自主导航领域的创新应用,具备较强的科研参考价值与工程仿真意义。; 适合人群:具备一定智能优化算法理论基础和Matlab编程能力,从事无人机路径规划、群体智能、自主导航系统研究的研究生、科研人员及自动化、航空航天领域的工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、巡检、救援等任务中的三维航迹规划与动态障碍规避;②为哈里斯鹰算法(HHO)及其改进型(如TTHHO)的研究提供可复现的实现案例,支持与其他智能算法(如GWO、PSO、SCA等)进行性能对比分析;③服务于相关科研项目的仿真验证、学术论文撰写及路径规划模块的原型开发。; 阅读建议:建议结合提供的Matlab代码深入剖析算法实现流程,重点关注目标函数的构建逻辑、约束条件的处理机制以及瞬态三角策略对种群多样性和收敛速度的影响,并可通过调整环境参数、障碍物分布或引入不同威胁模型进一步测试算法鲁棒性与适应性。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值