开发中的一个需求,需要将一个自关联的表取出数据后,反映到前台的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形式了。