根据例子做了一个Ajax的树菜单
发现一个问题,情况如下:
第一步: 初始化顶层节点,顶层节点有A节点一个
第二步: 点A节点,从数据库加载A节点的子节点
假设有A1,A2,A3三个节点
第三步: 顺序点A1,A2,A3 到这里以上步骤都正常
但是问题出现了 如果我先点A2 那么A1 的节点就点不出来了 如果先点A3 那A1和A2的节点就点不出来了。
因为我程序里面有一个判断,如果这个节点为加载那么就加载这个节点的内容,如果已经加载就不做操作。
给我的感觉是这个树构建的问题在于每次获取一个节点的内容的时候实际上后台是在获取这个节点之上的所有节点的内容,并不是单纯的获取你点的那个节点,如果我不判断是否已经加载的话倒是能正常,但是这样的开销太大了,整个树结构都变得很慢,无法忍受。
详细点说就是如果有三个并列节点a、b、c顺序排列,如果我点c节点,那实际的操作时获取了a、b、c三个节点的内容,但是只显示c节点的内容,如果点b节点是获取了a、b节点的内容只显示b的内容,如果点a是正常的,只获取a节点的内容。
我的例子的代码如下
JSP
复制内容到剪贴板JSP 代码:
<w:tree animate=\"true\" lines=\"true\"
asyncData=\"#{ServerSideMenu.getFileInFolder}\"
nodeHasChildren=\"#{ServerSideMenu.isFolder}\" nodeText=\"#{ServerSideMenu.getFileName}\">
<w:treeEventListener binding=\"#{PageBean}\" select=\"true\"/>
</w:tree>
后台java的获取节点的那段代码如下
复制内容到剪贴板JAVA 代码:
public List<File> getFileInFolder
(Object userData
) { List<File> list = new ArrayList<File>();
File file = (File)userData;
if (userData != null) id = file.getFileId();
if (file != null) {
System.out.println(\"菜单ID\"+file.getFileId());
System.out.println(\"菜单名称\"+file.getFileName());
System.out.println(\"是否文件夹\"+file.isFolder());
System.out.println(\"是否已加载\"+file.isLoaded());
}
if ((file == null) || (!file.isLoaded())) {
DBConnection conn = new DBConnection(\"531\");
StringBuffer sql = new StringBuffer(\"select * from g_all_menu_rightItem where parent_id = '\");
sql.append(id).append(\"'\");
System.out.println(sql.toString());
Result r = conn.runQuery(sql.toString());
if (r.isSuccess()) {
DBResultSet rs = (DBResultSet)r.getValue();
while (rs.next()) {
String menuId = rs.get(\"intid\").toString();
String menuName = rs.get(\"strname\").toString();
String menuLink = rs.get(\"menu_link\").toString();
String menuDesc = menuLink;
String menuIcon = \"\";
boolean isFolder = true;
sql = new StringBuffer(\"select count(*) count from g_all_menu_rightItem where parent_id = '\");
sql.append(menuId).append(\"'\");
System.out.println(sql.toString());
Result rc = conn.runQuery(sql.toString());
if (rc.isSuccess()) {
DBResultSet rsc = (DBResultSet)rc.getValue();
rsc.moveFirst();
if (rsc.get(\"count\").toString().equals(\"0\")) {
isFolder = false;
}
} else {
System.out.println(rc.getMessage());
}
list.add(new File(menuId,menuName,menuLink,menuIcon,menuDesc,isFolder));
if (file != null) file.setLoaded(true);
}
} else {
System.out.println(r.getMessage());
}
}
return list;
}
请高手指点~...在线等 谢谢
[
本帖最后由 guo_zjin 于 2007-12-17 10:34 编辑 ]