做完整个小Demo整理的一些方法和踩过的miniUI的坑,分享出来希望大家批评指正,共同进步。
1、动态创建列:尽量不要直接在html文件里创建列,动态设置在js文件里方面添加、修改等。
首先把列定义在变量中,例:
- var items=[
- { field:"id",width:"30",header:"id"},
- { field:"id",width:"30",header:"id"},
- ...
- ]
- grid.set({
- style:"width:800px;"... ,
- columns:items
- })
2、将本地数据传入表格:setData函数,将自己模拟的数据传入表格(哈哈,编名字的的技术还不错吧)
- var arr=[
- { id:1,name:"王力坤",gender:1,age:28},
- { id:2,name:"周大宝",gender:1,age:19},
- { id:3,name:"李小明",gender:0,age:21},
- ....
- ];
- grid.setData(arr);
3、性别渲染器:存放的数据中,性别一般用1 ,0 来代替 男 、女。这时需要在性别行添加 renderer:"onGenderRenderer",然后定义函数onGenderRenderer :
- var Genders = [{ id: 1, text: '男' }, { id: 0, text: '女'}];
- function onGenderRenderer(e) {
- for (var i = 0, l = Genders.length; i < l; i++) {
- var g = Genders[i];
- if (g.id == e.value) return g.text;
- }
- return "";
- };
4、用drawcell渲染:age<23的数据行为红色:
- .red{
- color:red;
- }
- grid.on( "drawcell",function(e){
- var record=e.record;
- if(record.age<23){
- e.rowStyle= "color:red" ;
- }
- });
这里的red为外部定义的样式。
其实我起初想到的另一种方法,就是用mini的findrows方法找到age<23的行,然后用addRowCls给每个符合的行增加样式。但是后来发现一个问题,就是改动别的地方时也要重新写一遍,造成代码重复,所以还是上面的方法比较好。
5、 confirm和mini.confirm:选择删除行数据的时候,会弹出警告框确认是否要删除,有”确定“和”取消“两个按钮。
坑:confirm的时候,点击“确定”按钮会删除;而到了mini.confirm的时候,不管点击哪个按钮都会删除,踩了半天的坑才发现,原来mini.confirm跟alert的功能是一样的,这是一个弹出的警告框。我们要想让它实现confirm的功能,必须把要执行的函数放在它的回调函数中,附上代码:
(1)confirm警告框:
- if(confirm("确定删除记录?")){
- if(action=="ok"){
- grid.removeRows(rows);
- }
- } else{
- mini.alert( "请选中一条记录");
- }
(2)mini.confirm警告框:
- mini.confirm( "确定删除记录?","警告",function(action){ //confirm返回Boolean,mini.confirm()返回警告框,必须加回调函数
- if(action=="ok"){
- grid.removeRows(rows);
- }
- })
- } else{
- mini.alert( "请选中一条记录");
- }
6、chrome浏览器下 CloseOwnerWindow 问题:添加完数据的时候,chrome下点击按钮没反应,火狐和ie却可以,这是因为必须把项目部署在服务器上,CloseOwnerWindow函数才能正常执行。
这里附上一个解决办法:
7、父页面获取子页面控件值得问题: 子页面用mini表单自带的方法form.getData()获取控件值,父页面在open函数的ondestroy中可以获取到值却显示不出来,这可能有好几个问题:
(1)lz因为比较粗心,function忘记传参,相当于没有判断条件,自然就错掉了,所以大家在找bug的时候一定要仔细看代码的细节。lz当时是这样写的,不堪回首啊~~ 子页面传了action=”ok“父页面却没有写参数.....
- ondestroy: function (此处是空的...) {
- if(action=="ok"){
- var iframe = this.getIFrameEl();
- var add_data = iframe.contentWindow.GetData();
- ...
- }
- }
-
- 而子页面:
- function closeWindow(action) {
- if (window.CloseOwnerWindow)
- return window.CloseOwnerWindow(action);
- else
- window.close();
- }
- function onOk() {
- closeWindow( "ok");//这里传了个action="ok"
- }
(2)可能还有一种情况,就是当你把新获取到的数据添加到数组的时候,没有重新setData。要记得setData两次哦,第一次是定义完列的时候传进初始数据,第二次是把新数组的值传进去。
- ondestroy: function (action) {
- if(action=="ok"){
- var iframe = this.getIFrameEl();
- var add_data = iframe.contentWindow.GetData();
- $.extend( true,add_data,add_data);//add_data=mini.clone(add_data);
- arr.push(add_data);
- //这里要注意,一定要再传一次更新后的数组
- grid.setData(arr);
- }
- }
- })
8、mini.clone:mini在获取到数据一定要克隆数据mini.clone才可以使用,这里用jQuery的深拷贝也可以实现。
大家可以自己试一下哦 :
9、控件只读:子页面id不可编辑,只需要把控制设置为只读就可以了哦。
- function SetData(data){
- var fields = form.getFields(); //获取控件
- var c=fields[0]; //id的控件
- if(data.action="edit"){
- data=$.extend( true,data,data);
- if(c.setReadOnly){ //设置控件只读
- c.setReadOnly( true);
- }
- form.setData(data.edit_item);
- }
- }
10、电话号码校验:在控件中validation属性校验
- <input id= "phoneNumber" name="phoneNumber" class="mini-textbox" onvalidation="onIsPhonenumberAllow" required="true"/>
-
-
- function onIsPhonenumberAllow(e) {
- var reg= /^1[34578]\d{9}$/;
- if (e.isValid) {
- if (reg.test(e.value) == false) {
- e.errorText = "请输入正确的手机号码!";
- e.isValid = false;
- }
- }
- }