递归手动生成treepanel的子孙树节点

开发中的一个需求,需要将一个自关联的表取出数据后,反映到前台的ext树形式。由于鄙人对ext不怎么熟,或许不用下面这么麻烦实现子孙节点关系,但是开发时为了快速实现原型,才想到下面的方法,或许只是下策。

由于从后台取得的数据是List<Map>形式,一个map是一条数据,数据之间没有直接的子孙关系,
并且本地renderJson方法是将Map转化为json形式传递到前台,renderJson本身不会组织数据之间的子孙关系,然而ext构建树节点需要 [{id:'xx',text:'xxx',children:[{id:'xxx',text:'',leaf:true},{.....}]}] 这种形式。这种对象中有数组的形式导致我不得不转化数据,所以需要转化List<Map>中的数据,以便renderJson可以生成符合ext树节点json的形式。


下面是自己手动转化数据,在后台将数据转化为ext的树节点子孙关系结构。最后json形式传递到前台,生成treepanel子孙节点。感觉效率不怎么高,需要优化,也许我没想到更好的方法。

//yuyong 2012-3-14

//"select level,a.* from zzjg a start with a.id in (select id from zzjg where //super_id is null)\n" +
// "connect by prior a.id=a.super_id\n" +
// "order by level"
//categoryQuery.listAll()是通过上述迭代查询获取数据,讲父级节点查出置于前列。
List<Map>lists=categoryQuery.listAll();
List<Map>treeNodes=new ArrayList<Map>();
while(lists.size()>0){
for(Iterator iter=lists.iterator();iter.hasNext();){
Map m= (Map) iter.next();
if(m.get("PARENT_ID")==null ){
Map map=new HashMap();
map.put("id", toInteger(m.get("ID")));
map.put("text", m.get("NAME"));
map.put("path", m.get("PATH"));
map.put("leaf", true);
treeNodes.add(map);
iter.remove();
}
else
for(Map map:treeNodes){
Map mapSon=new HashMap();
mapSon.put("id", toInteger(m.get("ID")));
mapSon.put("text", m.get("NAME"));
mapSon.put("path", m.get("PATH"));
if(appendChild(map,toInteger(m.get("PARENT_ID")),mapSon)){
iter.remove();
break;
}
}
}
}
this.renderJson(treeNodes, resp);


//递归添加子节点,将子节点添加到父节点的children集合中
private boolean appendChild(Map map,Integer parentId,Map mapSon){
if(((Integer)map.get("id")).intValue()==parentId.intValue()){
if(map.get("children")==null){
map.put("children", new ArrayList<Map>());
}
map.put("leaf", false);
mapSon.put("leaf", true);
((List<Map>)map.get("children")).add(mapSon);
return true;
}else{
if(map.get("children")!=null){
List<Map>lists=(List<Map>) map.get("children");
for(Map m:lists){
if(appendChild(m,parentId,mapSon))
return true;
}
}
}
return false;
}


//yuyong 2012-3-14

这样传递到前台的数据就是[{id:'xx',text:'xxx',children:[{id:'xxx',text:'',leaf:true},{.....}]}] 的json形式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值