esayUI dataGrid动态绑定列,通用查询模版

发布于 2012-09-20  49.3k 次阅读


好久没写博,连QQ空间都不逛,都快没激情了,偶尔会记一些工作笔记和札记,也只是局限QQ空间,今天忙了一天,总算把基本的框架搭的差不多了,在自己博屋把工作中遇到的一些问题记录下来。

 

easyUI还是蛮不错的,界面的渲染,参数的绑定,语法的拓展都是比较完美。也有中文的API。

一些细节上的修改在jquery.easyui.min.js里可以找到,并自己修改(当然,必须你有非常的耐心和细心),后面我会整理一些有关tree的用法和拓展,基础类的在自带的document里有、。

 

 

言归正传,用easyUI的话,这么丰富的绑定,必定会用到动态列绑定,每个页面查询的列和属性都不同,我开始是想在源码里改源码调,后来发现,实在太难了~官网里没有详细的介绍,网上也不是很全,

 

先说下我的思路(不愿画图,将就吧),首先通过ajax请求获得你所需要展示的数据,返回一个json,先不急着把数据填充进datagrid,把框架模版初始化,然后再通过datagrid的loadData方式填充(具体查api),然后再渲染剩下的。

//$.ajax 先异步拿到数据
              
$.getJSON(param.action+'?id='+param.id+'&t='+Math.random(),function(data){
              
    var _peConfig = data.peConfig;        //这个是列的属性,如果你也需要动态的话
        $("#mainTable").datagrid({
            iconCls:'icon-save',
            nowrap: false,
            striped: true,
            collapsible:true,
//            url:param.action+'?id='+param.id+'&t='+Math.random(),
            onLoadSuccess:function(data){
            },
            loadMsg:"正在载入...",
            sortName: _peConfig.sortName,
            sortOrder: _peConfig.sortOrder,
            remoteSort: false,
            idField:_peConfig.idField,
            frozenColumns:[[
                        {field:'ck',checkbox:_peConfig.checkable},
                        {title:_peConfig.title,field:_peConfig.field,width:80,sortable:_peConfig.sortable}
            ]],
            columns:[[        
            ]],
            pagination:true,
            rownumbers:true,
            });
            var p = $('#mainTable').datagrid('getPager');
            if (p){
                $(p).pagination({
                    onBeforeRefresh:function(){
                        $(this).pagination('loading');
                    }
                });
            }
              
                //填充数据
              
            $("#mainTable").datagrid({columns:new Array(data.columns)}).datagrid("loadData",data.records);
            $('#mainTable').datagrid('getPager').pagination({displayMsg:'当前显示从{from}到{to}共{total}记录'});
    });

 

下面是java代码,

        Map recordsMap = new HashMap();
        List columnsList = new ArrayList();
        recordsMap.put("total", list.size());
        recordsMap.put("rows", list);//list是显示数据
                          
        columnsList.add(new PageElementConfig("公司名称","companyName","center",true,null,null,null));
        columnsList.add(new PageElementConfig("公司地址","companyAddr","center",true,null,null,null));
        columnsList.add(new PageElementConfig("公司负责人","companyContact","center",true,null,null,null));
                          
        map.put("records", recordsMap);
        map.put("columns", columnsList);
        map.put("peConfig", new PageElementConfig("公司ID","companyId","companyId","companyId","desc",true));

 

前台用到的参数

public class PageElementConfig{
    private Integer rowspan;    //并行
    private Integer colspan;    //并列
    private boolean sortable;    //是否排序
    private boolean checkbox;    //是否为多选
    private String width;        //宽度
    private String align;        //对齐方式
    private String title;        //列显示文本
    private String field;        //对应变量
    private String sortName;     //固定列变量
    private String sortOrder;    //desc or asc
    private String idField;      //主键

 

 

 

 

 

 

 

 

 

我看到struts源码的时候发现这样的语法,

List extensions = new ArrayList() {{ add("action");}};

其中add方法是ArrayList自带的,

而在java1.6中,

List list = new ArrayList(){{new ColumnsPage("testName")}}; 这样是没有用的,list还是空

我不明白这样的初始化的原因,和初始化之后,extensions 指向的对象个什么状态?
我知道ArrayList其实在维护一个数组,那这个初始化方式产生了几个数组?

 

后来测试发现,ArrayList是一个类,如果这样写:
   ArrayList list=new ArrayList(){{add("action");}};
  ArrayList作为匿名的内部类生成一个实例,把引用赋给list
  {add("action");}作为这个内部类的初始化代码块而 存在的