打印

关于w:tree树结构的问题,是不是一个小bug呢?还是我使用错误?在线等

关于w:tree树结构的问题,是不是一个小bug呢?还是我使用错误?在线等

根据例子做了一个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 代码:
  1. <w:tree animate=\"true\" lines=\"true\"
  2.       asyncData=\"#{ServerSideMenu.getFileInFolder}\"
  3.          nodeHasChildren=\"#{ServerSideMenu.isFolder}\" nodeText=\"#{ServerSideMenu.getFileName}\">
  4. <w:treeEventListener binding=\"#{PageBean}\" select=\"true\"/>
  5. </w:tree>
后台java的获取节点的那段代码如下
复制内容到剪贴板
JAVA 代码:
  1.    public List<File> getFileInFolder(Object userData) {
  2.       List<File> list = new ArrayList<File>();
  3.       String id = \"0\";
  4.       File file = (File)userData;
  5.       if (userData != null) id = file.getFileId();
  6.       if (file != null) {
  7.          System.out.println(\"菜单ID\"+file.getFileId());
  8.          System.out.println(\"菜单名称\"+file.getFileName());
  9.          System.out.println(\"是否文件夹\"+file.isFolder());
  10.          System.out.println(\"是否已加载\"+file.isLoaded());
  11.       }
  12.       if ((file == null) || (!file.isLoaded())) {
  13.          DBConnection conn = new DBConnection(\"531\");
  14.          StringBuffer sql = new StringBuffer(\"select * from g_all_menu_rightItem where parent_id = '\");
  15.          sql.append(id).append(\"'\");
  16.          System.out.println(sql.toString());
  17.          Result r = conn.runQuery(sql.toString());
  18.          if (r.isSuccess()) {
  19.             DBResultSet rs = (DBResultSet)r.getValue();
  20.             while (rs.next()) {
  21.                String menuId = rs.get(\"intid\").toString();
  22.                String menuName = rs.get(\"strname\").toString();
  23.                String menuLink = rs.get(\"menu_link\").toString();
  24.                String menuDesc = menuLink;
  25.                String menuIcon = \"\";
  26.                boolean isFolder = true;
  27.                sql = new StringBuffer(\"select count(*) count from g_all_menu_rightItem where parent_id = '\");
  28.                sql.append(menuId).append(\"'\");
  29.                System.out.println(sql.toString());
  30.                Result rc = conn.runQuery(sql.toString());
  31.                if (rc.isSuccess()) {
  32.                   DBResultSet rsc = (DBResultSet)rc.getValue();
  33.                   rsc.moveFirst();
  34.                   if (rsc.get(\"count\").toString().equals(\"0\")) {
  35.                      isFolder = false;
  36.                   }
  37.                } else {
  38.                   System.out.println(rc.getMessage());
  39.                }
  40.                list.add(new File(menuId,menuName,menuLink,menuIcon,menuDesc,isFolder));
  41.                if (file != null) file.setLoaded(true);
  42.             }
  43.          } else {
  44.             System.out.println(r.getMessage());
  45.          }
  46.       }
  47.       return list;
  48.    }
请高手指点~...在线等 谢谢

[ 本帖最后由 guo_zjin 于 2007-12-17 10:34 编辑 ]

TOP

有两个可能性:
1.v1.2m2这个版本的tree,因为引入一些新的特性,已发现数据加载是有些问题的,你可以下载最新的snap包试试。
2.你加入的额外代码,反而导致树工作异常。

tree是按需加载数据的,一般来说不需要自己在程序里用额外的代码去判断它的加载,除非你已经认真阅读过tree组件的实现代码,知道这样做不会导致异常。

TOP

动态树本来就能自行判断当点击某个节点时,是否已经加载了这个节点的数据,所以楼主不必自己写代码判断是否已经加载,而且已经加载了数据的节点也不会去查数据库。你可以看看rcdemos动态树的例子,例子中动态树一开始将所有数据都加载了,但在所有数据都加载完后点击任何一个节点都不会再去后台读取数据。

[ 本帖最后由 evadam 于 2007-12-17 10:54 编辑 ]

TOP

谢谢楼上的回答
那个是否已经加载的问题倒是容易解释,我也理解,主要是以前使用icefaces的时候的习惯.
再烦问一下薛定谔的猫 最新的那个snap包从哪里下载呢?

TOP

TOP

谢谢哈 我再尝试一下
其实还有一个问题我也觉得是系统的问题
就是我初始化节点的时候其实应该是12个顶层节点
我的list里面也的确存在12条数据
但是显示出来的只有一个节点
但是没有发现我程序哪里存在问题..

TOP

12个顶层节=12个root节点?还是说只显示一个root节点,其他节点都没有展开?

TOP

非常感谢 薛定谔的猫...
那个每次全部加载的问题解决掉了
但是顶层节点还是只加载出来了一个,按照理论上来讲第一次的时候getFilesInFolder的 userData是 null
所以我判断了如果是Null的话我就把parent_id设置为0 然后把所有的顶层节点读出 共12个节点,
程序 也确实读出了 但是显示的时候为何只显示了一个节点呢?
是我的那个isLoaded的判断的问题吗?

TOP

明白了一点点 也就是说 第一次载入的节点为root节点
root节点只能有一个对吧?
如果我要一次弄出12个节点来的话必须要给这12个节点先指定一个root节点?是不是这个问题?

TOP

ok 问题解决 就是偶理解的那样子 第一次载入的节点为root节点 root节点只能一个......
再次感谢..

TOP