工作ui(2)

做完整个小Demo整理的一些方法和踩过的miniUI的坑,分享出来希望大家批评指正,共同进步。

1、动态创建列:尽量不要直接在html文件里创建列,动态设置在js文件里方面添加、修改等。

首先把列定义在变量中,例:

  1. var items=[
  2. { field:"id",width:"30",header:"id"},
  3. { field:"id",width:"30",header:"id"},
  4. ...
  5. ]
  6. grid.set({
  7. style:"width:800px;"... ,
  8. columns:items
  9. })

2、将本地数据传入表格:setData函数,将自己模拟的数据传入表格(哈哈,编名字的的技术还不错吧)

  1. var arr=[
  2. { id:1,name:"王力坤",gender:1,age:28},
  3. { id:2,name:"周大宝",gender:1,age:19},
  4. { id:3,name:"李小明",gender:0,age:21},
  5. ....
  6. ];
  7. grid.setData(arr);

3、性别渲染器:存放的数据中,性别一般用1 ,0 来代替 男 、女。这时需要在性别行添加 renderer:"onGenderRenderer",然后定义函数onGenderRenderer :

  1. var Genders = [{ id: 1, text: '男' }, { id: 0, text: '女'}];
  2. function onGenderRenderer(e) {
  3. for (var i = 0, l = Genders.length; i < l; i++) {
  4. var g = Genders[i];
  5. if (g.id == e.value) return g.text;
  6. }
  7. return "";
  8. };

4、用drawcell渲染:age<23的数据行为红色:

  1. .red{
  2. color:red;
  3. }
  4. grid.on( "drawcell",function(e){
  5. var record=e.record;
  6. if(record.age<23){
  7. e.rowStyle= "color:red" ;
  8. }
  9. });

      这里的red为外部定义的样式。    

      其实我起初想到的另一种方法,就是用mini的findrows方法找到age<23的行,然后用addRowCls给每个符合的行增加样式。但是后来发现一个问题,就是改动别的地方时也要重新写一遍,造成代码重复,所以还是上面的方法比较好。

5、 confirm和mini.confirm选择删除行数据的时候,会弹出警告框确认是否要删除,有”确定“和”取消“两个按钮。

坑:confirm的时候,点击“确定”按钮会删除;而到了mini.confirm的时候,不管点击哪个按钮都会删除,踩了半天的坑才发现,原来mini.confirm跟alert的功能是一样的,这是一个弹出的警告框。我们要想让它实现confirm的功能,必须把要执行的函数放在它的回调函数中,附上代码:

(1)confirm警告框:

  1. if(confirm("确定删除记录?")){
  2. if(action=="ok"){
  3. grid.removeRows(rows);
  4. }
  5. } else{
  6. mini.alert( "请选中一条记录");
  7. }

(2)mini.confirm警告框:

  1. mini.confirm( "确定删除记录?","警告",function(action){//confirm返回Boolean,mini.confirm()返回警告框,必须加回调函数
  2. if(action=="ok"){
  3. grid.removeRows(rows);
  4. }
  5. })
  6. } else{
  7. mini.alert( "请选中一条记录");
  8. }

6、chrome浏览器下 CloseOwnerWindow 问题:添加完数据的时候,chrome下点击按钮没反应,火狐和ie却可以,这是因为必须把项目部署在服务器上,CloseOwnerWindow函数才能正常执行。

 这里附上一个解决办法:解决如何把项目放到服务器运行的问题

7、父页面获取子页面控件值得问题: 子页面用mini表单自带的方法form.getData()获取控件值,父页面在open函数的ondestroy中可以获取到值却显示不出来,这可能有好几个问题:

(1)lz因为比较粗心,function忘记传参,相当于没有判断条件,自然就错掉了,所以大家在找bug的时候一定要仔细看代码的细节。lz当时是这样写的,不堪回首啊~~ 子页面传了action=”ok“父页面却没有写参数.....

  1. ondestroy: function (此处是空的...) {
  2. if(action=="ok"){
  3. var iframe = this.getIFrameEl();
  4. var add_data = iframe.contentWindow.GetData();
  5. ...
  6. }
  7. }
  8.  
  9. 而子页面:
  10. function closeWindow(action) {
  11. if (window.CloseOwnerWindow)
  12. return window.CloseOwnerWindow(action);
  13. else
  14. window.close();
  15. }
  16. function onOk() {
  17. closeWindow( "ok");//这里传了个action="ok"
  18. }

(2)可能还有一种情况,就是当你把新获取到的数据添加到数组的时候,没有重新setData。要记得setData两次哦,第一次是定义完列的时候传进初始数据,第二次是把新数组的值传进去。

  1. ondestroy: function (action) {
  2. if(action=="ok"){
  3. var iframe = this.getIFrameEl();
  4. var add_data = iframe.contentWindow.GetData();
  5. $.extend( true,add_data,add_data);//add_data=mini.clone(add_data);
  6. arr.push(add_data);
  7. //这里要注意,一定要再传一次更新后的数组
  8. grid.setData(arr);
  9. }
  10. }
  11. })

8、mini.clone:mini在获取到数据一定要克隆数据mini.clone才可以使用,这里用jQuery的深拷贝也可以实现。

大家可以自己试一下哦 : js的几种拷贝方法

9、控件只读:子页面id不可编辑,只需要把控制设置为只读就可以了哦。

  1. function SetData(data){
  2. var fields = form.getFields(); //获取控件
  3. var c=fields[0]; //id的控件
  4. if(data.action="edit"){
  5. data=$.extend( true,data,data);
  6. if(c.setReadOnly){ //设置控件只读
  7. c.setReadOnly( true);
  8. }
  9. form.setData(data.edit_item);
  10. }
  11. }

10、电话号码校验:在控件中validation属性校验

  1. <input id= "phoneNumber" name="phoneNumber" class="mini-textbox" onvalidation="onIsPhonenumberAllow" required="true"/>
  2.  
  3.  
  4. function onIsPhonenumberAllow(e) {
  5. var reg= /^1[34578]\d{9}$/;
  6. if (e.isValid) {
  7. if (reg.test(e.value) == false) {
  8. e.errorText = "请输入正确的手机号码!";
  9. e.isValid = false;
  10. }
  11. }
  12. }

猜你喜欢

转载自www.cnblogs.com/But-you/p/10274766.html