日期:2014-05-16  浏览次数:20726 次

Ext TreePanel 动态加载数据问题,迷惑了 求高手
读取数结构 如果某个节点下面是没有数据的,点击+号之后 又重新读取loader action 地址
这是什么原因
 

如图


var mytree = new Ext.tree.TreePanel({
region : 'west',
tbar : scheduleTreeToolbar,
split : true,
autoScroll : true,
animate : true,
collapsible : true,
frame : true,
enableDD : true,
enableDrag : true,
rootVisible : true, // 默认值 显示根节点
autoScroll : true,
autoHeight : true,
width : 250,
lines : true,
loader : new Ext.tree.TreeLoader({
baseAttrs : {},
dataUrl : contextPath
+ '/getPanel.action'

,
listeners : {
"loadexception" : function(loader, node, response) {
// 加载服务器数据
node.loaded = false;
node.reload.defer(10, node);
}
}

}),
useArrows : false,
// 根节点
root : new Ext.tree.AsyncTreeNode({
id : 'root',
text : '调度分类',
expanded : true
})
});


[b]后台代码
List menus = new ArrayList();
Lis  bglist = scheduleService.getTreeBigCls();

for (int i = 0, len = bglist.size(); i < len; i++) {
TreeNodeJsonBean bzmenu = new TreeNodeJsonBean();
bzmenu.setId(bglist.get(i).getbid());
bzmenu.setText(bglist.get(i).getbidname());
bzmenu.setCls("folder");
bzmenu.setLeaf(false);
menus.add(bzmenu);

String assmoName= Struts2Utils.getParameter("name");
Set<String> assNameSet = new HashSet<String>();
assNameSet = scheduleService.getScheduleNames(assmoName,
bglist.get(i).getbid());
           List benList = new ArrayList();
for (String item : assNameSet ) {
// 添加子类查询结果并添加到pacl
bzmenu.setChildren(benList);
TreeNodeJsonBean menu = new TreeNodeJsonBean();
menu.setId(item);
menu.setLeaf(true);
menu.setText(item);
menu.setCls("file");
benList.add(menu);
}
}
}
Struts2Utils.renderJson(menus, "encoding:UTF-8");

------解决方案--------------------
每当有一个子节点展开TreeLoader才会load子节点的数据,load之前TreeLoader并不知道会不会得到数据,所以无论有无数据将要加载它都会访问loader action 地址。这是TreeLoader的默认行为,它也不会影响程序呀,为什么为它操心?
------解决方案--------------------
楼上说的没错,如果你不想这么做的话,你需要在你展现出来的树中判断哪些是根,哪些是叶子节点
------解决方案--------------------
没有数据的时候最好设置leaf:true设置成叶子节点
------解决方案--------------------
你要加个监听事件,当点“+”号的时候把 当前节点的ID作为一个参数传递给loader