Bootstrap Table服务器分页与在线编辑应用总结


Posted in Javascript onAugust 08, 2016

先看Bootstrap Table应用效果:

Bootstrap Table服务器分页与在线编辑应用总结

 表格用来显示数据库中的数据,数据通过AJAX从服务器加载,同时分页功能有服务器实现,避免客户端分页,在加载大量数据时造成的用户体验不好。还可以设置查询数据的起止时间,查询一定时间范围的数据。在线编辑功能通过扩展Bootstrap Table实现,使用X-editable实现。

Bootstrap Table有两种使用方式:

 1.对普通的 table 设置 data 属性;

 2.通过JavaScript 来启用 Bootstrap Table 插件。

第一种方式很方便,但是我更倾向于第二种方法,可以做到JS和HTML的分离,并且JS代码可以复用。

Bootstrap Table的文档比较详细,但是有一些具体内容还得看示例代码等。

先贴出前台和后台的实现代码,再具体介绍。

前台需要的资源文件,主要有Bootstrap3相关样式、js以及bootstrap Table相关css、js以及X-editable基于Bootstrap3的样式、js:

<link rel="stylesheet" href="../assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="../assets/bootstrap-table/src/bootstrap-table.css">
<link rel="stylesheet" href="//rawgit.com/vitalets/x-editable/master/dist/bootstrap3-editable/css/bootstrap-editable.css">
<script src="../assets/jquery.min.js"></script>
<script src="../assets/bootstrap/js/bootstrap.min.js"></script>
<script src="../assets/bootstrap-table/src/bootstrap-table.js"></script>
<script src="../assets/bootstrap-table/src/extensions/editable/bootstrap-table-editable.js"></script>
<script src="//rawgit.com/vitalets/x-editable/master/dist/bootstrap3-editable/js/bootstrap-editable.js"></script>

HTML代码只需要

<table id="querylist" class="table table-striped"></table>

JS代码,时间查询相关代码,查询时间设置正确后,通过bootstrap Table方法refresh重新加载数据:

$('#submitgetdata').click(function () {
  $('#msg').html('');
  var begintime_ = $('#begintime').val();
  var endtime_ = $('#endtime').val();
  var err = '';
  if (begintime_ == '' || endtime_ == ''){
    err = '查询时间不能为空';
  }else if(Date.parse(endtime_)-Date.parse(begintime_) < 0){
    err = '查询时间设置错误';
  }
  if (err) {
    $('#msg').html(err + '!');
    $('#msg').fadeIn(1000);
  }
  else {
    $('#msg').html("正在提交!");
    $('#querylist').bootstrapTable('refresh');
    $('#msg').fadeOut(3000);
  }
});

Table相关js:

$('#querylist').bootstrapTable({
  columns: [{
    field: 'MeterMeasureHistoryID',
    title: 'ID',
    sortable: true
  }, {
    field: 'Value',
    title: '值',
    editable: {
      type: 'text',
      validate: function(value) {
        if($.trim(value) == '') {
          return '测量值不能为空';
        }
      }
    }
  }, {
    field: 'Timestamp',
    title: '时间',
    editable: {
      type: 'text',
      validate: function(value) {
        if($.trim(value) == '') {
          return '时间不能为空';
        }else if(!Date.parse(value)){
          return '时间设置错误';
        }
      }
    }
  },{
    field: 'operation',
    title: '操作',
    formatter:function(value,row,index){
      var s = '<a class = "save" href="javascript:void(0)">保存</a>';
      var d = '<a class = "remove" href="javascript:void(0)">删除</a>';
      return s+' '+d;
    },
    events: 'operateEvents'
  }],
  sortName: 'MeterMeasureHistoryID',
  sortOrder: 'desc',
  pagination: true,
  sidePagination: 'server',
  pageNumber: 1,
  pageSize: 5,
  pageList: [5, 10, 20],
  queryParams: function (params) {
    return {
      meterID: $('#meterid').val(),
      pageSize: params.limit,
      offset: params.offset,
      sortOrder: params.order,
      begintime: $('#begintime').val(),
      endtime: $('#endtime').val()
    }
  },
  url: '/Analyze/GetJsonHistoryDatas'
});
window.operateEvents = {
  'click .save': function (e, value, row, index) {
    $.ajax({
      type: "post",
      data: row,
      url: '/Analyze/EditMeterMeasureHistoryData',
      success: function (data) {
        alert('修改成功');
      }
    });
  },
  'click .remove': function (e, value, row, index) {
    $.ajax({
      type: "post",
      data: row,
      url: '/Analyze/DeleteMeterMeasureHistoryData',
      success: function (data) {
        alert('删除成功');
        $('#querylist').bootstrapTable('remove', {
          field: 'MeterMeasureHistoryID',
          values: [row.MeterMeasureHistoryID]
        });
      }
    });
  }
};

columns参数设置表格的所有列以及每列的参数,field对应json返回数据的键值以及在Bootstrap Table中的列参数;title对应显示的列名称;sortable设置按着当前列排序;formatter设置列中每个单元格格式;editable设置当前列单元格的编辑方式,还可以设置validate验证方式。

因此实际表格设置为四列,依据第1列排序,2、3列是可以编辑的,type设置为text,可以根据需要使用其他的type,第2列验证数据不能为空,第3列验证输入值是时间;1、2、3列的内容来自服务器返回的json数据;第4列是对当前行的数据操作,并且加入监听事件operateEvents,绑定到window上。

Bootstrap Table服务器分页与在线编辑应用总结

sortName设置为第1列field值;

sortOrder设置为逆序;

pagination为true表示分页;

sidePagination为server表示服务器分页;

pageNumber表示默认起始页;

pageSize表示每页显示数据个数;

pageList表示可选的每页显示数据个数;

queryParams表示每次发送给服务器的参数,可以添加自己需要的参数;

url是数据的请求地址。

查看bootstrap-table.js,可以看到默认params参数:

BootstrapTable.prototype.initServer = function (silent, query) {
    var that = this,
      data = {},
      params = {
        pageSize: this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows : this.options.pageSize,
        pageNumber: this.options.pageNumber,
        searchText: this.searchText,
        sortName: this.options.sortName,
        sortOrder: this.options.sortOrder
      };
    if (!this.options.url) {
      return;
    }
    if (this.options.queryParamsType === 'limit') {
      params = {
        search: params.searchText,
        sort: params.sortName,
        order: params.sortOrder
      };
      if (this.options.pagination) {
        params.limit = this.options.pageSize === this.options.formatAllRows() ?
          this.options.totalRows : this.options.pageSize;
        params.offset = this.options.pageSize === this.options.formatAllRows() ?
: this.options.pageSize * (this.options.pageNumber - 1);
      }
    }

服务器后台实现三个功能,一个是根据数据加载,以及数据修改和删除。

public ActionResult GetJsonHistoryDatas()
{
  var displayStart = int.Parse(Request["offset"]);
  var displayLength = int.Parse(Request["pageSize"]);
  var meterID = int.Parse(Request["MeterID"]);
  var order = Request["sortOrder"];
  var historyDatas = db.MeterMeasureHistories.
    Where(p => p.MeterMeasure.MeterID == meterID).
    OrderByDescending(p => p.Timestamp).
    Skip(displayStart).
    Take(displayLength).ToList();//显示最近的 displayLength 条数据
  if ("asc" == order)
  {
    historyDatas = db.MeterMeasureHistories.
    Where(p => p.MeterMeasure.MeterID == meterID).
    OrderBy(p => p.Timestamp).
    Skip(displayStart).
    Take(displayLength).ToList();//显示最早的 displayLength 条数据
  }
  int historyDataTotal = db.MeterMeasureHistories.
    Where(p => p.MeterMeasure.MeterID == meterID).Count();//数据总条数
  //时间过滤
  if (!String.IsNullOrEmpty(Request["begintime"]))
  {
    DateTime begintime = DateTime.Parse(Request["begintime"]);
    DateTime endtime = DateTime.Parse(Request["endtime"]);
    historyDatas = db.MeterMeasureHistories.
      Where(p => p.MeterMeasure.MeterID == meterID).
      Where(p => p.Timestamp > begintime && p.Timestamp < endtime).
      OrderByDescending(p => p.Timestamp).
      Skip(displayStart).
      Take(displayLength).ToList();//显示最近的 displayLength 条数据
    if ("asc" == order)
    {
      historyDatas = db.MeterMeasureHistories.
      Where(p => p.MeterMeasure.MeterID == meterID).
      Where(p => p.Timestamp > begintime && p.Timestamp < endtime).
      OrderBy(p => p.Timestamp).
      Skip(displayStart).
      Take(displayLength).ToList();//显示最早的 displayLength 条数据
    }
    historyDataTotal = db.MeterMeasureHistories.
      Where(p => p.MeterMeasure.MeterID == meterID).
      Where(p => p.Timestamp > begintime && p.Timestamp < endtime).Count();//数据总条数
  }
  List<MeterMeasureHistoryDataViewModels> ListMeterMeasureHistories = new List<MeterMeasureHistoryDataViewModels>();
  foreach (var item in historyDatas)
  {
    ListMeterMeasureHistories.Add(new MeterMeasureHistoryDataViewModels
    {
      MeterMeasureHistoryID = item.MeterMeasureHistoryID,
      Value = item.Value,
      Timestamp = item.Timestamp.ToString()
    });
  }
  string jsonDataTable = JsonConvert.SerializeObject(
    new
    {
      total = historyDataTotal,
      rows = ListMeterMeasureHistories
    });
  return Content(jsonDataTable);
}

其中实现了分页以及数据查询,返回json数据,返回的json数据包括total、rows两个对象,total表示数据总数,rows表示需要显示的数据。MeterMeasureHistoryDateView如下,对应Table中的field值:

public class MeterMeasureHistoryDataViewModels
{
  public int MeterMeasureHistoryID { get; set; }
  public double Value { get; set; }
  public string Timestamp { get; set; }
}

数据修改函数:

[HttpPost]
public JsonResult EditMeterMeasureHistoryData()
{
  var metermeasurehistoryid = int.Parse(Request["MeterMeasureHistoryID"]);
  var metermeasurehistoryvalue = double.Parse(Request["Value"]);
  var metermeasurehistorytime = DateTime.Parse(Request["Timestamp"]);
  var metermeasurehistoryInDb = db.MeterMeasureHistories.Find(metermeasurehistoryid);
  metermeasurehistoryInDb.Value = metermeasurehistoryvalue;
  metermeasurehistoryInDb.Timestamp = metermeasurehistorytime;
  db.SaveChanges();
  var changedData = new MeterMeasureHistoryDataViewModels
    {
      MeterMeasureHistoryID = metermeasurehistoryInDb.MeterMeasureHistoryID,
      Value = metermeasurehistoryInDb.Value,
      Timestamp = metermeasurehistoryInDb.Timestamp.ToString()
    };
  JsonResult js = new JsonResult();
  js.Data = Json(changedData);
  return js;
}

数据删除函数:

[HttpPost]
public JsonResult DeleteMeterMeasureHistoryData()
{
  var metermeasurehistoryid = int.Parse(Request["MeterMeasureHistoryID"]);
  db.MeterMeasureHistories.Remove(db.MeterMeasureHistories.Find(metermeasurehistoryid));
  db.SaveChanges();
  var deletedData = new MeterMeasureHistoryDataViewModels
  {
    MeterMeasureHistoryID = metermeasurehistoryid,
    Value = 0,
    Timestamp = null
  };
  JsonResult js = new JsonResult();
  js.Data = deletedData;
  return js;
}

服务器删除后,前台通过bootstrap Table方法remove删除指定数据行。

目前就使用了这些,总结下学习过程,就是查官方文档、示例,看源码,并学会使用Chrome开发者工具,查看Sources和Network。

以上所述是小编给大家介绍的Bootstrap Table服务器分页与在线编辑应用总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
一个刚完成的layout(拖动流畅,不受iframe影响)
Aug 17 Javascript
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
Dec 02 Javascript
如何让页面加载完成后执行js
Jun 26 Javascript
Javascript数组操作函数总结
Feb 05 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
JavaScript判断浏览器和hack滚动条的写法
Jul 23 Javascript
JS实现匀加速与匀减速运动的方法示例
Sep 04 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
Oct 19 jQuery
node.js的exports、module.exports与ES6的export、export default深入详解
Oct 26 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
Jul 22 jQuery
layui2.0使用table+laypage实现真分页
Jul 27 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
Aug 08 #Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 #Javascript
用js读写cookie的简单方法(推荐)
Aug 08 #Javascript
Js遍历键值对形式对象或Map形式的方法
Aug 08 #Javascript
js中遍历Map对象的简单实例
Aug 08 #Javascript
14 个折磨人的 JavaScript 面试题
Aug 08 #Javascript
js中 计算两个日期间的工作日的简单实例
Aug 08 #Javascript
You might like
php实现简单文件下载的方法
2015/01/30 PHP
PHP强制转化的形式整理
2020/05/22 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
JavaScript 原型继承
2011/12/26 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
详解js的六大数据类型
2016/12/27 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
python中常用检测字符串相关函数汇总
2015/04/15 Python
对Python3中的input函数详解
2018/04/22 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
2018/04/27 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
Python eval函数原理及用法解析
2020/11/14 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
秘书岗位职责
2013/11/18 职场文书
顶岗实习接收函
2014/01/09 职场文书
30岁生日感言
2014/01/25 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
软件售后服务方案
2014/05/29 职场文书
2014教师党员自我评议(5篇)
2014/09/20 职场文书
委托书格式要求
2015/01/28 职场文书
员工自我评价范文
2015/03/11 职场文书