JS组件系列——BootstrapTable表格⾏拖拽
前⾔:之前⼀直在研究DDD相关知识,好久没更新JS系列⽂章了。这两天做了⼀个简单的业务需求,觉得效果还可以,今天在这⾥分享给⼤家,欢迎拍砖~~
⼀、业务需求及实现效果
项⽬涉及到订单模块,那天突然接到⼀个需求,说是两种不同状态的订单之间要实现插单的效果,页⾯上呈现⽅式是:左右两个Table,左边Table⾥⾯是状态为1的订单,右边Table⾥⾯是状态为2订单,左边Table⾥⾯的⾏数据拖动到右边Table⾥⾯指定⾏的位置,拖动完成后,左边表格减少⼀⾏,右边表格增加⼀⾏。除此之外,还需要撤销操作(相当于Ctrl + Z操作),能够返回到上⼀步的状态。可能描述会让⼤家模拟两可,反正已经实现了,先来看看效果图吧。
1、先看看拖动之前的效果
2、这是拖动左边表格⾏数据的效果
3、拖动⼀⾏完成之后表格数据的效果
4、第⼆次、第三次拖动完成后效果
5、右边表格上⾯撤销操作点击效果
6、多次点击撤销,表格回到初始状态
⼆、代码⽰例
初初接到需求,博主的第⼀感觉是应该上Bootstrap table api⾥⾯⼀下,毕竟开源的⼒量是强⼤的,或许有相关的⽰例呢。经过⼀番查,很可惜,Bootstrap Table没有这种两张表格之间的操作。想想其实也可以理解,Bootstrap Table是针对某个动态表格数据绑定的,它的侧重点是表格内部的功能,⽐如表格内部⾏的拖拽排序(Reorder Rows)有很好的解决⽅案,对于像博主这样的特殊需求,似乎也应该⾃⼰去实现。
1、需求分析
既然决定⾃⼰去写,博主开始分析需求,似乎这个操作⾥⾯⽐较困难的是拖拽效果,说到拖拽效果,原来使⽤JsPlumb的时候那使⽤太多了,于是就想到了我们神奇的JQuery UI ⾥⾯的draggable.js 和dr
oppable.js。拖拽的问题解决了,那么还有⼀个难点,就是撤销操作怎么办?我们知道Ctrl+z的意思是还原,什么叫还原?就是返回到上⼀步的操作,那么前提是要能够保存上⼀步的状态,说到保存某⼀步的状态,博主就知道怎么做了,需要⼀个全局变量Json,⾥⾯要有三个键值对,分别是当前步骤的索引、左边表格的数据、右边表格的数据。似乎也不太难嘛,博主就此着⼿,开⼲。
2、代码⽰例
2.1 cshtml页⾯代码
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>@ViewBag.Title</title>
@Styles.Render("~/Content/css")
@Styles.Render("~/Content/table-css")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/knockout")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/bootstrap-table")
@RenderSection("Scripts", false)
</head>
<body>
@RenderBody()
</body>
</html>
母版_layout.cshtml
@{
ViewBag.Title = "订单插单";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@Scripts.Render("~/bundles/Order/InsertOrder")
@Styles.Render("~/bundles/Order/css")
@Scripts.Render("~/Content/bootstrap/datepicker/js")
@Styles.Render("~/Content/bootstrap/datepicker/css")
<script src="~/Content/jquery-ui-1.11.4.custom/jquery-ui.min.js"></script>
<div class="panel-body" >
<div class="panel panel-default" >
<div class="panel-heading">查询条件</div>
<div class="panel-body container-fluid">
<div class="row">
<div class="col-md-3">
<label for="txt_search_ordernumber" class="col-sm-4 control-label" >订单号</label>
<span class="col-sm-8">
<input type="text" class="form-control" id="txt_search_ordernumber">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_bodynumber" class="col-sm-3 control-label" >车⾝号</label>
<span class="col-sm-8">
<input type="text" class="form-control" id="txt_search_bodynumber">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_vinnumber" class="col-sm-4 control-label" >VIN码</label>
<span class="col-sm-8">
<input type="text" class="form-control" id="txt_search_vinnumber">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_engin_code" class="col-sm-4 control-label" >发动机号</label>
<span class="col-sm-8">
<input type="text" class="form-control" id="txt_search_engin_code">
</span>
</div>
</div>
<div class="collapse" id="div_more_search">
<div class="row" >
<div class="col-md-3">
<label for="txt_search_import_startdate" class="col-sm-4 control-label" >导⼊时间</label>
<span class="col-sm-8">
<input type="text" class="form-control datetimepicker" readonly id="txt_search_import_startdate">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_import_enddate" class="col-sm-3 control-label" >⾄</label>
<span class="col-sm-8">
<input type="text" class="form-control datetimepicker" readonly id="txt_search_import_enddate">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_send_startdate" class="col-sm-4 control-label" >下发时间</label>
<span class="col-sm-8">
<input type="text" class="form-control datetimepicker" readonly id="txt_search_send_startdate">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_send_enddate" class="col-sm-4 control-label" >⾄</label>
<span class="col-sm-8">
<input type="text" class="form-control datetimepicker" readonly id="txt_search_send_enddate">
</span>
</div>
</div>
<div class="row" >
<div class="col-md-3">
<label for="txt_search_carcode" class="col-sm-4 control-label" >整车编码</label>
<span class="col-sm-8">
<input type="text" class="form-control" id="txt_search_carcode">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_vms" class="col-sm-3 control-label" >VMS号</label>
<span class="col-sm-8">
<input type="text" class="form-control" id="txt_search_vms">
</span>
</div>
<div class="col-md-3">
<label for="txt_search_trans_code" class="col-sm-4 control-label" >变速箱号</label>
<span class="col-sm-8">
<input type="text" class="form-control" id="txt_search_trans_code">
</span>
</div>
</div>
</div>
<div class="row" >
<div>
<button type="button" id="btn_query" class="btn btn-primary" >查询</button>
<button type="submit" id="btn_reset" class="btn btn-default" >重置</button>
</div>
</div>
</div>
</div>
<div class="collapse_div_outside">
<div class="collapse_div_inside"></div>
<span id="span_collapse" href="#div_more_search" class="collapse_div_inside_ele">展开<label class="glyphicon glyphicon-menu-down"></label></span> </div>
</div>
@*<div id="toolbar_left" class="btn-group">
</div>*@
<div id="toolbar_right" class="btn-group">
<button id="btn_cancel" type="button" class="btn btn-default">
<span class="glyphicon glyphicon-backward aria-hidden="true"></span>撤销
</button>
<button id="btn_insertorder" type="button" class="btn btn-default">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>插单
</button>
</div>
<div class="panel-body" >
<div id="div_tableleft" class="col-md-6">
<table id="tb_order_left"></table>
</div>
<div id="div_tableright" class="col-md-6">
<table id="tb_order_right"></table>
</div>
</div>
订单插单页⾯.cshtml
2.2 js代码
var i_statuindex = 0;
//此数组⽤于保存撤销操作每⼀步的数据
var arrdata = [];
var m_oTable = null;
$(function () {
//1.初始化表格
m_oTable = new TableInit();
m_oTable.Init();
//2.初始化按钮事件
var oButtonInit = new ButtonInit();
oButtonInit.Init();
//3.⽇期控件的初始化
$(".datetimepicker").datetimepicker({
format: 'yyyy-mm-dd hh:ii',
autoclose: true,
todayBtn: true,
});
});
//表格相关事件和⽅法
var TableInit = function () {
var oTableInit = new Object();
oTableInit.Init = function () {
    //初始化左边表格
$('#tb_order_left').bootstrapTable({
url: '/api/OrderApi/get',
method: 'get',
striped: true,
cache: false,
striped: true,
pagination: true,
height: 600,
uniqueId:"TO_ORDER_ID",
queryParams: oTableInit.queryParams,
queryParamsType: "limit",
sidePagination: "server",
pageSize: 10,
pageList: [10, 25, 50, 100],
search: true,
strictSearch: true,
showColumns: true,
showRefresh: true,
minimumCountColumns: 2,
clickToSelect: true,
columns: [{
checkbox: true
},
{
field: 'ORDER_NO',
title: '订单号'
},
{
field: 'BODY_NO',
title: '车⾝号'
}, {
field: 'VIN',
title: 'VIN码'
}, {
field: 'TM_MODEL_MATERIAL_ID',
title: '整车编码'
},
{
field: 'ORDER_TYPE',
title: '订单类型'
},
{
field: 'ORDER_STATUS',
title: '订单状态'
},
{
field: 'CREATE_DATE',
title: '订单导⼊时间'
},
{
field: 'PLAN_DATE',
title: '订单计划上线⽇期'
},
{
jquery是什么功能组件field: 'VMS_NO',
title: 'VMS号'
},
{
field: 'ENGIN_CODE',
title: '发动机号'
},
{
field: 'TRANS_CODE',
title: '变速箱号'
},
{
field: 'OFFLINE_DATE_ACT',
title: '实际下线⽇期'
},
{
field: 'HOLD_RES',
title: 'hold理由'
},
{
field: 'SPC_FLAG',
title: '特殊标记'
},
],
onLoadSuccess: function (data) {
//表格加载完成之后初始化拖拽
          oTableInit.InitDrag();
}
});
    //初始化右边表格
$('#tb_order_right').bootstrapTable({
url: '/api/OrderApi/get',
method: 'get',
toolbar: '#toolbar_right',
striped: true,
cache: false,
striped: true,
pagination: true,
height: 600,
queryParams: oTableInit.queryParamsRight,            queryParamsType: "limit",
//ajaxOptions: { departmentname: "", statu: "" },

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。