bootstrap-table使用总结

原网址:bootstrap-table使用总结

1、下载:

https://github.com/wenzhixin/bootstrap-table

2、文档:

http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/

3、引用:

<link rel="stylesheet" href="bootstrap.min.css"><link rel="stylesheet" href="bootstrap-table.css"> <script src="jquery.min.js"></script><script src="bootstrap.min.js"></script><script src="bootstrap-table.js"></script><script src="bootstrap-table-zh-CN.js"></script>

注意:最后一个是一些提醒文字,如果有引用这个js则会以中文提示,如果没有则以英文提示。

4、基本用法:

html里:

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

js里:

        $('#table').bootstrapTable({            columns: [{                field: 'id',                title: 'Item ID'            }, {                field: 'name',                title: 'Item Name'            }, {                field: 'price',                title: 'Item Price'            }],            data: [{                id: 1,                name: 'Item 1',                price: '$1'            }, {                id: 2,                name: 'Item 2',                price: '$2'            }]        });

这个data也可以换成url:

$('#table').bootstrapTable({    url: 'data1.json',    columns: [{        field: 'id',        title: 'Item ID'    }, {        field: 'name',        title: 'Item Name'    }, {        field: 'price',        title: 'Item Price'    }, ]});

注意:url和data的区别是:url是异步请求远程数据;data是直接把数据赋值给他。在主表和子表都一样可以这样使用。

5、引入fonts:

一些图标需要用到bootstrap里面的文件,要从下载的bootstrap包里面拷贝过来放到对应的目录(看错误提醒)。

但是只放进去是访问不了的,因为他不是普通的文件,所以要设置。

进入iis管理器,找到“MIME类型”,双击进去,在右边菜单点击“添加”,分别添加以下类型:

.woffapplication/x-font-woff .woff2          application/x-font-woff

再刷新页面就可以加载fonts里面这些文件了。

6、定制组件

(function () {    function init(table,url,params,titles,hasCheckbox,toolbar) {        $(table).bootstrapTable({            url: url,                           //请求后台的URL(*)            method: 'post',                     //请求方式(*)            toolbar: toolbar,                   //工具按钮用哪个容器            striped: true,                      //是否显示行间隔色            cache: false,                       //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)            pagination: true,                   //是否显示分页(*)            sortable: false,                    //是否启用排序            sortOrder: "asc",                   //排序方式            queryParams: queryParams,           //传递参数(*),这里应该返回一个object,即形如{param1:val1,param2:val2}            sidePagination: "server",           //分页方式:client客户端分页,server服务端分页(*)            pageNumber:1,                       //初始化加载第一页,默认第一页            pageSize: 20,                       //每页的记录行数(*)            pageList: [20, 50, 100],            //可供选择的每页的行数(*)            search: true,                       //是否显示表格搜索,此搜索是客户端搜索,不会进服务端,所以,个人感觉意义不大            strictSearch: true,            showColumns: true,                  //是否显示所有的列            showRefresh: true,                  //是否显示刷新按钮            minimumCountColumns: 2,             //最少允许的列数            clickToSelect: true,                //是否启用点击选中行            //height: 500,                      //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度            uniqueId: "ID",                     //每一行的唯一标识,一般为主键列            showToggle:true,                    //是否显示详细视图和列表视图的切换按钮            cardView: false,                    //是否显示详细视图            detailView: false,                  //是否显示父子表             columns: createCols(params,titles,hasCheckbox),            data: [{                id: 1,                name: 'Item 1',                price: '$1'            }, {                id: 2,                name: 'Item 2',                price: '$2'            }]        });    }    function createCols(params,titles,hasCheckbox) {        if(params.length!=titles.length)            return null;        var arr = [];        if(hasCheckbox)        {            var objc = {};            objc.checkbox = true;            arr.push(objc);        }        for(var i = 0;i<params.length;i++)        {            var obj = {};            obj.field = params[i];            obj.title = titles[i];            arr.push(obj);        }        return arr;    }    //可发送给服务端的参数:limit->pageSize,offset->pageNumber,search->searchText,sort->sortName(字段),order->sortOrder('asc'或'desc')    function queryParams(params) {        return {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的            limit: params.limit,   //页面大小            offset: params.offset  //页码            //name: $("#txt_name").val()//关键字查询        };    }    // 传'#table'    createBootstrapTable = function (table,url,params,titles,hasCheckbox,toolbar) {        init(table,url,params,titles,hasCheckbox,toolbar);    } })();
1、调用:
createBootstrapTable('#table','',['id','name','price'],['Item ID','Item Name!','Item Price!'],true,'#toolbar');
2、模块:

注意,这些只要添加上一行代码就会自动显示的:

pagination 显示分页search     搜索功能showColumns  控制显示哪些列的按钮showRefresh  刷新按钮showToggle   详细视图和列表视图切换按钮

但是这个不会:

toolbar

这个toolbar会关联到我们填的一个元素,但是他并不会自动创建所有菜单,而是我们要创建好菜单,他只不过把这个菜单放到合适的位置,实现这些菜单的功能还需要我们自己去做。toolbar如下:

    <div id="toolbar" class="btn-group">        <button id="btn_add" type="button" class="btn btn-default">            <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增        </button>        <button id="btn_edit" type="button" class="btn btn-default">            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>修改        </button>        <button id="btn_delete" type="button" class="btn btn-default">            <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除        </button>    </div>
3、sidePagination

这个是选择服务端或者客户端分页,客户端则填'client',服务端则填'server',他们的数据结构是不同的。

这是客户端分页的数据结构:

[    {        "id": 0,        "name": "Item 0",        "price": "$0"    },    {        "id": 1,        "name": "Item 1",        "price": "$1"    },    {        "id": 2,        "name": "Item 2",        "price": "$2"    }]

这是服务端分页的数据结构:

{    "total": 200,    "rows": [        {            "id": 0,            "name": "Item 0",            "price": "$0"        },        {            "id": 1,            "name": "Item 1",            "price": "$1"        },        {            "id": 2,            "name": "Item 2",            "price": "$2"        }    ]}

这是因为客户端来分页的话,他直接根据数据总量进行判断要分成多少页,而服务端的话就需要返回一个total给他,因为服务端返回给的数据是一个片段,他没办法根据这个片段来计算多少页。

注意:这里可以看到,服务端分页和客户端分页数据结构的层次是不同的。他接受哪种数据结构,取决于是否加这个参数:

sidePagination:'server'

特别是做子表的时候,因为觉得没有做分页的必要,就没了这句话,结果就是数据过去了死活不显示,排查很久才发现是这个问题。

4、参数上传

我们知道,当我们对table设置一个url的时候,他不仅是请求这个url,他还会带一些参数上来,他到底带来了什么参数?

我们来一个最简单的测试一下:

        $('#table').bootstrapTable({            striped: true,            pagination:true,            sidePagination:'server',            url:'/xx/yy',            columns: [{                field: 'id',                title: 'Item ID'            }, {                field: 'name',                title: 'Item Name'            }, {                field: 'price',                title: 'Item Price'            }]        });

这里我们简单的初始化了一个bootstrap-table,数据来源我们指定了url,有个参数叫method,默认是'get',也可以设为'post',如果实际上线最好设为'post',但是这里我们就用默认的好了,可以直接在浏览器的控制台看到他请求的参数。

[图片上传失败...(image-4f0f9e-1534495897109)]

我们可以看到带了一些参数上来

(1)order=asc表示排序是升序排序,这个我们可以在参数里面设置:sortOrder: "asc/desc"(两种选一种)

(2)offset=0表示从数据从哪个row开始,简单的说从第几行数据开始

(3)limit=10表示选取多少个数据,也就是一页有多少条数据

2,3跟参数pageNumber和pageSize是紧密关联的。

pageSize对应的就是limit,因此改变pageSize就改变了limit;

pageNumber结合pageSize可以算出offset。

比如pageNumber=1,pageSize=30,那么offset=0,limit=30;

比如pageNumber=2,pageSize=30,那么offset=30,limit=30。

他不传第几页上来,而是传从第几行开始,选取多少行,这样一个数据。

注意:pageNumber从1开始而非从0开始,但是offset是从0开始的。

如果我尝试设置pageNumber:0,pageSize:30我们会发现offset=-30,limit=30,这是不对的。

5、参数的查看、修改

那么我们可以直接查看这些参数以及修改吗?答案是可以的。

有个原始参数就是用来配置这个:

queryParams:testQParams

创建函数:

function testQParams(params) {            alert('params.limit='+params.limit+' params.offset='+params.offset);//我们可以这样查看这些要上传的参数        }

我们当然可以修改或者添加参数:

        function testQParams(params) {            return {                limit:params.limit,                offset:params.offset,                order:params.order,                abc:123,                def:456            }        }

有几点要注意:

1、我们当然可以修改limit、offset这些参数,但是不建议在这里改,我们可以用上面这种方式还给他赋值;

2、虽然没有改动他,我们也不要丢了,如果在这里没写参数就丢了,传递的参数会以这里的为准;

3、我们可以增加新的参数。

[图片上传失败...(image-e4aa39-1534495897108)]

7、显示图片

字段通常是一个地址,那么我们要显示图片应该使用formatter:

{                field: 'thumb_img',                title: '主图',                align: 'center',                formatter:function (value,row,index) {                    return '<img  src='+value+' width=50 class="img-rounded" >';                }            }

可以直接定义宽度,图片会自动进行缩放。

8、行内编辑功能

<1>bootstrap-editable

需要一个bootstrap插件叫做bootstrap-editable,现在改名叫做x-editable了,可以适用不同的框架。

地址:https://github.com/vitalets/x-editable

下载下来之后,找到dist/bootstrap3-editable里面的3个文件夹css,js,img都拷贝到我们的网站目录下。

<2>bootstrap-table-editable

这是一个bootstrap-table的插件(插件的插件),这个插件呢就在我们下载的bootstrap-table包里,路径是dist/extensions/editable

把他拷到我们的对应目录下即可

<3>引入
<link href="<?php echo '/static/bootstrap/extensions/editable/css/bootstrap-editable.css'; ?>" rel="stylesheet"><script src="<?php echo '/static/bootstrap/extensions/editable/js/bootstrap-editable.js'; ?>"></script><script src="<?php echo '/static/bootstrap-table/extensions/editable/bootstrap-table-editable.js'; ?>"></script>

注意他们跟jquery、bootstrap、bootstrap-table的依赖关系,所以要放在他们的后面。

<4>使用1:

在列定义里面加上editable:true,比如:

                field:'addr',                title:'地址',                editable:true,

就会变成可编辑状态了

<5>使用2:

编辑完成我们要添加一个回调

在bootstrapTable顶级的属性定义里面,添加一个回调函数:

            onEditableSave:function (field,row,oldValue,$el) {                //alert('保存addr='+row.addr+' id='+row.itemid);            }

这里我们可以看到当编辑完保存的时候就会调用到这个函数,在row里面有所有当前行的信息,那么我们可以通过把这个信息用ajax传递到服务器保存起来。

编辑功能完成。

<6>保存验证+ajax保存确认+取消保存

我们在实际开发当中,经常需要这样的功能:

(1)验证用户的输入是否正确;

(2)如果用户输入不正确,就不要在页面上显示了,直接显示保存不了;

(3)如果用户输入正确,通过ajax请求保存到后台;

(4)如果保存到后台失败,应该返回前端失败的消息,前端的内容回退到保存前的状态;

(5)如果保存成功,前端也做相应的显示样式调整及状态确定。

在上面“使用1”及“使用2”当中,当点击保存的时候,在save函数里验证不起作用,你再验证他也保存进去了。所以验证另有地方。

应该这样做:

(1)把editable:true改为:
                    validate:function (value) {                        value = $.trim(value);                        if (!value)                        {                            return '必须填入一个网址,不能放空!';                        }                        if (!checkUrl(value))                        {                            return '输入的不是一个合法的网址!';                        }                     }

另外,在这个函数里,要取的row数据可以这样:

                        var data = $('#table').bootstrapTable('getData');                        var index = $(this).parents('tr').data('index');                        console.log(data[index]);

这是因为这个$(this)可以指向这个当前单元格

这样输入就有验证功能,return一个字符串他会自动不保存进去,而显示这个字符串的提示。

注意,验证的保存规则:

如果return ''; 则会保存空字符串;

如果return 'xxx'; 则不会保存这个字符串,而是作为提示显示出来;

如果不return,则按照原value保存。

(2)把onEditableSave改为:
                onEditableSave:function (field,row,oldValue,$el) {                    // 测试证明oldValue取到的是undefined                    $.post('xxx/yyy')                        .done(function (result) {                            //在这里解析result                            if(保存成功)                            {                                // 页面提示保存成功                            }else                            {                                // 页面提示保存失败                                // buy_addr_bak这个字段是从服务端传过来与buy_addr等值的一个字段,就是为了在必要的时候恢复数据                                $el.text(row.buy_addr_bak);                            }                            // 不管保存成功还是失败,已经不是编辑状态,把加粗去掉                            $el.removeClass('editable-unsaved');                        });                }

另外,在这个函数里,如果要取到row数据可以这样(虽然这里没有必要,参数里已经有了):

                var data = $('#table').bootstrapTable('getData');                var index = $el.parent().parents('tr').data('index');//注意这里一个是parent,一个是parents                console.log(data[index]);

9、自动换行

在给table加上样式:

style="word-break:break-all; word-wrap:break-all;"

10、父子表

功能:点击行首的加号,下拉展开一个子表

<1>在父表的属性里添加

detailView:true

<2>添加回调函数

                onExpandRow:function (index,row,$detail) {                    initSubTable(index,row,$detail);                }

当点击行首的加号,将会触发这个回调函数,这个回调函数会再去调用执行函数。

<3>执行函数

        function initSubTable(index,row,$detail) {            var parentid = row.MENU_ID;            var cur_table = $detail.html('<table></table>').find('table');//注意这个'table'不是一个id,他在任何情况下不需要改变            $(cur_table).bootstrapTable({                url:'',                method:'post',                queryParams:{strParentID:parentid},                ajaxOptions:{strParentID:parentid},                clickToSelect:true,                detailView:true,                uniqueId:"MENU_ID",                pageSize:10,                pageList:[10,25],                columns:[                    {                        filed:'from',                        title:'from'                    },                    {                        field:'url',                        title:'url'                    },                    {                        field:'to',                        title:'to'                    }                ],                onExpandRow:function (index,row,$Subdetail) {                    initSubTable(index,row,$Subdetail);                }            });        }

注意,这里做了一个递归,即子表里面还可以展开孙表,我们也可以不需要,去掉就可以了。

11、刷新功能

$('#table_search').bootstrapTable(                    "refresh",                    {                        url:"/japp/autobuy/ajaxorder/search"                    }                );
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 在业务系统开发中,对表格记录的查询、分页、排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足...
    往事随feng阅读 3,311评论 0 13
  • 使用bootstrap-table做分页时候,我们可能会用到limit和pageNumber两个参数传递给后台。分...
    李北北阅读 12,005评论 0 3
  • 是要回去了,五个多小时的车程。他坚持要送我回成都,第二天再买回程。 上车的时候他跟在我后面,我趁他不注意,回头亲了...
    萧北笙烟阅读 355评论 0 0
  • 许多人对家作了各种的诠释。众所周知的托尔斯泰说的“幸福的家庭彼此都相似,不幸的却各有各的不幸”,我同意。网络上各种...
    狂小烹阅读 956评论 8 18
  • 在东北,冬天不滑雪的,基本上就没啥玩的了,滑雪和泡温泉~周末去了一次周边的滑雪场。算一下具体的费用哈。 1、设备费...
    Lisasong阅读 335评论 0 0