|
一直都想用layui的表格table功能,它实现了一些列功能和动态化数据操作,涵盖了日常业务所涉及的几乎全部需求。支持固定表头、固定行、固定列左/列右,支持拖拽改变列宽度,支持排序,支持多级表头,支持单元格的自定义模板,支持对表格重载(比如搜索、条件筛选等),支持复选框,支持分页,支持单元格编辑等等一些列功能.
上面的功能是从官方复制的, 只是说明下它的强悍, 好多功能我还没结合aar测试....
下面记录下,我学习table的过程,
由于是边写测试代码边写这个帖子, 可能比较啰嗦, 没耐心的可以直接跳过过程看结果.
正题开始:
首先去layui下载它的支持文件.
然后我查看了layui的table表格示例:
新建webkit窗体,添加个test.html并复制和修改那个layui的示例代码如下:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>layui</title>
- <meta name="renderer" content="webkit">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
- <link rel="stylesheet" href="layui/css/layui.css" media="all">
- <!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
- </head>
- <body>
-
- <table class="layui-hide" id="test"></table>
-
-
- <script src="layui/layui.js" charset="utf-8"></script>
- <!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->
-
- <script>
- layui.use('table', function(){
- var table = layui.table;
-
- table.render({
- elem: '#test'
- ,url:'http://www.layui.com/demo/table/user/'
- ,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
- ,cols: [[
- {field:'id', width:80, title: 'ID', sort: true}
- ,{field:'username', width:80, title: '用户名'}
- ,{field:'sex', width:80, title: '性别', sort: true}
- ,{field:'city', width:80, title: '城市'}
- ,{field:'sign', title: '签名', width: '30%', minWidth: 100} //minWidth:局部定义当前单元格的最小宽度,layui 2.2.1 新增
- ,{field:'experience', title: '积分', sort: true}
- ,{field:'score', title: '评分', sort: true}
- ,{field:'classify', title: '职业'}
- ,{field:'wealth', width:137, title: '财富', sort: true}
- ]]
- });
- });
- </script>
-
- </body>
- </html>
复制代码
上面js代码中的网址其实就是一个json数据:
- {"code":0,"msg":"","count":1000,"data":[{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75}]}
复制代码
在aar的窗体程序代码如下:
- import win.ui;
- /*DSG{{*/
- var winform = win.form(text="aardio form";right=881;bottom=419;bgcolor=16777215;parent=...)
- winform.add()
- /*}}*/
-
- import web.kit.form;
- var wbkitview = web.kit.form(winform);
- //wbkitview.document.write("试一试!");
- wbkitview.go("/html/test.html");
-
- wbkitview.external = {
- aardioCall = function(str){
- winform.msgbox(str);
- };
- }
-
- /*
-
- winform.button.oncommand = function(id,event){
- //winform.msgbox( winform.button.text );
- wbkitview.getForm(false)
-
- }
- */
- winform.enableDpiScaling();
- winform.show();
-
- win.loopMessage();
复制代码
那么,如果我已知了数据,应该怎么直接把数据展示在table,而不是通过什么url来间接异步获取呢?
于是查看layui关于table模块的参数文档:
可以利用data直接写到html文件的js里,而不是用url
于是把html中的js修改如下:
- <script>
- layui.use('table', function(){
- var table = layui.table;
-
- table.render({
- elem: '#test'
- //,url:'http://www.layui.com/demo/table/user/'
- ,skin: 'row' //行边框风格
- ,even: true //开启隔行背景
- ,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
- ,heitht:300
- ,cols: [[
- {field:'id', width:80, title: 'ID', sort: true}
- ,{field:'username', width:80, title: '用户名'}
- ,{field:'sex', width:80, title: '性别', sort: true}
- ,{field:'city', width:80, title: '城市'}
- ,{field:'sign', title: '签名', width: '30%', minWidth: 100} //minWidth:局部定义当前单元格的最小宽度,layui 2.2.1 新增
- ,{field:'experience', title: '积分', sort: true}
- ,{field:'score', title: '评分', sort: true}
- ,{field:'classify', title: '职业'}
- ,{field:'wealth', width:137, title: '财富', sort: true}
- ]]
- ,data:[{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75}]
- });
- });
- </script>
复制代码
这里需要注意上面代码中data数据和前面通过url获取数据的格式区别!!
url获取数据有个头不信息,而data是没有的.
具体的不同可以查看这个模块的文档,这里不再复制过来了.
看到上面异步接口,就知道它们这样用的最大不同是,如果你要是准备分页..那么还是用url异步接口吧,人家有page和get,就和网页类似.
但是实际使用中,作为桌面应用软件,只是展示某些数据的话,完全不需要什么分页.(⊙o⊙)…,我是用不到.所以我更倾向于用aar直接生成数据,然后给这个data,刷新表格.
那么,如果数据是在aar中生成的,怎样才能传递到html的js中的data呢??
第一想到的应该就是利用wbkitview.external= {}函数.
我们在aar界面程序里定义一个这个函数:
- import web.json;
- wbkitview.external = {
- getOption = function(){
- data = /***
- [{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27},{"id":10002,"username":"user-2","sex":"女","city":"城市-2","sign":"签名-2","experience":650,"logins":77,"wealth":6298078,"classify":"酱油","score":31},{"id":10003,"username":"user-3","sex":"女","city":"城市-3","sign":"签名-3","experience":362,"logins":157,"wealth":37117017,"classify":"诗人","score":68},{"id":10004,"username":"user-4","sex":"男","city":"城市-4","sign":"签名-4","experience":807,"logins":51,"wealth":76263262,"classify":"作家","score":6},{"id":10005,"username":"user-5","sex":"女","city":"城市-5","sign":"签名-5","experience":173,"logins":68,"wealth":60344147,"classify":"作家","score":87},{"id":10006,"username":"user-6","sex":"女","city":"城市-6","sign":"签名-6","experience":982,"logins":37,"wealth":57768166,"classify":"作家","score":34},{"id":10007,"username":"user-7","sex":"男","city":"城市-7","sign":"签名-7","experience":727,"logins":150,"wealth":82030578,"classify":"作家","score":28},{"id":10008,"username":"user-8","sex":"男","city":"城市-8","sign":"签名-8","experience":951,"logins":133,"wealth":16503371,"classify":"词人","score":14},{"id":10009,"username":"user-9","sex":"女","city":"城市-9","sign":"签名-9","experience":484,"logins":25,"wealth":86801934,"classify":"词人","score":75}]
- ***/;
- return data;
- };
- }
复制代码
上面注意: 我是直接将原来html里面的data数据复制过来了.所以可以直接return.
如果你是由aar产生的class或者table表,那么就要
- return web.json.stringify(data);
复制代码
把表转换为json数据先.
那么html中怎么获取这个数据呢:
更改data:这行 为下面代码:
- ,data:JSON.parse(external.getOption())
复制代码
上面意思是获取外部提供的数据,并解析为json格式返回.
于是,运行就可以得到你想要的展示了.
实现展示之后,如果有数据更新了,那么就要刷新这个table里的数据,如何实现呢?
这就需要用到layui表格的重载:
查看layui的重载说明
tableIns.reload(options) 对象 tableIns 来源于 table.render() 方法的实例
参数 options 即为各项基础参数
我们从上面得知reload即可.那么在aar中怎么使用呢?
我们先在aar的界面上放一个按钮,用来点击重载数据.
我们写入:
- winform.button.oncommand = function(id,event){
- //winform.msgbox( winform.button.text );
-
- wbkitview.doScript(`tableObj.reload({data:[{"id":10000,"username":"user-0","sex":"女","city":"城市-0","sign":"签名-0","experience":255,"logins":24,"wealth":82830700,"classify":"作家","score":57},{"id":10001,"username":"user-1","sex":"男","city":"城市-1","sign":"签名-1","experience":884,"logins":58,"wealth":64928690,"classify":"词人","score":27}]})`);
-
- }
复制代码
上面是直接运行js代码功能,这里的tableObj是html中的js一个全局元素.
html中的位置如下:
- <script>
- layui.use('table', function(){
- var table = layui.table;
-
- tableObj = table.render({
- elem: '#test'
- //,url:'http://www.layui.com/demo/table/user/'
- ,skin: 'row' //行边框风格
- ,even: true //开启隔行背景
- ,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
- ,heitht:300
- ,cols: [[
- {field:'id', width:80, title: 'ID', sort: true}
- ,{field:'username', width:80, title: '用户名'}
- ,{field:'sex', width:80, title: '性别', sort: true}
- ,{field:'city', width:80, title: '城市'}
- ,{field:'sign', title: '签名', width: '30%', minWidth: 100} //minWidth:局部定义当前单元格的最小宽度,layui 2.2.1 新增
- ,{field:'experience', title: '积分', sort: true}
- ,{field:'score', title: '评分', sort: true}
- ,{field:'classify', title: '职业'}
- ,{field:'wealth', width:137, title: '财富', sort: true}
- ]]
- ,data:JSON.parse(external.getOption())
- });
- });
- </script>
复制代码
看到tableobj了吗? 前面是没有var修饰的,如果有修饰就执行不了了.
,运行的效果就是,点击按钮之后,界面上面的表格数据变为aar中设置的了.
(对于上面的示例,从很多数据,变为了只有两行的数据)
运行结果如下
先写这么多,休息一下.
未完待续! |
|