【combotree格式数据】List数据转换成combotree需要的数据格式,一次性加载 及 懒加载方式各举一例

        最近项目里遇到需要combotree的地方,需要把数据一次性加载完毕,所以要构造每个节点里带children属性的JSON数据,而不能选择懒加载的方式,每次点击展开图标时才加载本节点所属子节点数据。所以本文先介绍整体数据转换成combotree所需格式的方式,最后再介绍懒加载方式的实现。

        我们需要的数据格式举例如下:[{

"id":"id1",

"text":"text1",

"state":"closed",

"children":[{

        "id":"id11",

         "text":"text11"

        }]

}]

        但是我的数据是数据库查询出来的一条条的并列数据,需要自己组装。开始百度了半天发现不是手动给你写出个这个格式的JSON串的,就是一堆代码运行出来,结果数据还不对。最后只能自己写,思路可能跟网上大神很不同,但是也算完美解决了问题,记录如下:

        具体思路就是,把原始数据按数据层级(level,就是最后要形成的树结构里的层级,我的数据是用 start with -- connect by  -- prior 查出来的,所以天然可以查到level这个属性)先分组,有几个层级,就分成几组,每组数据组成一个list,然后从层级最大的那个list开始,一级级循环着把数据分别挂接到他的上层节点作为children,最后就形成了我们需要的数据结构。废话不多说,代码如下:

//将传入的list参数构造为combotree所需的格式
private List combotreeDataFormatter(List paraList){
    int maxLvl = 0;
    /*
    获取记录最大level--maxLvl,即树的最深层级。
    注意:此处的level为实际level-1,即最顶层数据level为0,而非1
    */
    for(Map paraMap: paraList){
        int tmpLvl = Integer.valueOf(String.valueOf(paraMap.get("nlevel")));
        if(tmpLvl > maxLvl){
            maxLvl = tmpLvl;
        }
    }
    //按maxLvl的值构造一个有n个List元素的总List,n=maxLvl+1,即树有几层,总List就有几个元素
    List allList = new ArrayList();
    for(int i=0; i<=maxLvl; i++){
        List tmpList = new ArrayList();
        allList.add(tmpList);
    }
    //将传入的paraList中的数据按level分组,分别放入总List的每个元素中,其中level=总List的下标
    int paraLen = paraList.size();
    for(int j=0; j=0; k--){
        List maxLvlList = (List) allList.get(k);
        if(k-1 >= 0){
            int maxLvlListLen = maxLvlList.size();
            for(int l=0; l

        附:数据查询SQL及部分查询结果:

        

【combotree格式数据】List数据转换成combotree需要的数据格式,一次性加载 及 懒加载方式各举一例_第1张图片

        最后说一下combobox懒加载的实现,即初次加载只加载顶级节点数据,有子节点的数据前面会显示+图标,当用户点击加号+图标时,再加载本节点所属子节点数据,其实实现起来很简单,使用combotree的onBeforeExpand回调函数即可,代码如下:

        

function initCombotree(tbn) {
    $("#sjbmdxdm").combotree({
        url: "<%=basePath%>flgl/childrenData",
        method: "GET",
        editable: false,
        width: 230,
        height: 30,
        queryParams: {
            "tbn": tbn,
            "datetime": new Date().getTime()
        },
        onBeforeExpand: function (node) {
            $("#sjbmdxdm").combotree("tree").tree("options").queryParams.sjbmdxdm = node.id;
        }
    });

你可能感兴趣的:(【combotree格式数据】List数据转换成combotree需要的数据格式,一次性加载 及 懒加载方式各举一例)