`

Ext 树.叶子查找与非叶子查找

 
阅读更多
ext的tree的filter即搜索功能,按照ext的API写有一个bug,当节点下有二级子节点的时候,filter其它节点,不论此节点是否满足filter条件,都会出现,搞了半天才将这个bug解决掉,现在记下来,以备以后用到。
原代码:

hiddenPkgs = [];
        tree.root.cascade(function(n) {
            if(!n.isLeaf()&& n.ui.ctNode.offsetHeight<3){
                n.ui.hide();
                hiddenPkgs.push(n);
            }
       });
bug主要出在这段控制隐藏的代码上,其中关键是n.ui.ctNode.offsetHeight<3,当节点有子节点的时候,他的n.ui.ctNode.offsetHeight就会大于3,所以会显示。修改这个bug,只需要修改这段代码即可。在源过滤条件后面加个条件,修改后的代码如下:
修改一:只支持对叶子的搜索,不支持对枝干的搜索
hiddenPkgs = [];
        tree.root.cascade(function(n) {
            if(!n.isLeaf()&& n.ui.ctNode.offsetHeight<3&& !re.test(n.text)){
                n.ui.hide();
                hiddenPkgs.push(n);
            }
            if(n.id!='root'){
                if(!n.isLeaf() && n.ui.ctNode.offsetHeight >= 3 && hasChild(n,re)==false&& !re.test(n.text)){
                    n.ui.hide();
                    hiddenPkgs.push(n);
                }
            }
        });
      
        function hasChild(n,re){
         var str=false;
         n.cascade(function(n1){
              if(n1.isLeaf() && re.test(n1.text)){
                  str = true;
                  return;
              }
          });
          return str;
       }
    }
修改二:支持对叶子、枝干的搜索。
var hiddenPkgs = [];
    var filter = new Ext.tree.TreeFilter(tree, {
        clearBlank: true,
          autoClear: true
    });
    function filterTree(){
      
          var text = members_name.getValue();
          Ext.each(hiddenPkgs, function(n){
            n.ui.show();
        });

        if(!text){
            filter.clear();        
            return;
        }

        tree.expandAll();
        var re = new RegExp(Ext.escapeRe(text), 'i');
     
        filter.filterBy(function(n){
             var textval = n.text;
            return !n.isLeaf() || re.test(n.text);
        });

        // hide empty packages that weren't filtered
        hiddenPkgs = [];
        tree.root.cascade(function(n) {
            if(!n.isLeaf()&& n.ui.ctNode.offsetHeight<3&& !re.test(n.text)){
                n.ui.hide();
                hiddenPkgs.push(n);
            }
            if(n.id!='root'){
                if(!n.isLeaf() && n.ui.ctNode.offsetHeight >= 3 && hasChild(n,re)==false&& !re.test(n.text)){
                    n.ui.hide();
                    hiddenPkgs.push(n);
                }
            }
        });
      
        function hasChild(n,re){
            var str=false;
            n.cascade(function(n1){
                 if(re.test(n1.text)){
                     str = true;
                     return;
                 }
             });
             return str;
       }
    }
修改二与修改一是有区别的,并且修改二不能取代修改一,因为,修改一也有应用点,如:如果只让用户对叶子进行搜索那么应该是当搜索枝干时应该没有结果,若用修改二则不很好,用修改一更合理
分享到:
评论
1 楼 Navee 2012-09-13  
抄来抄去,还是没有实质解决问题

相关推荐

    获取Extjs中的TreePanel中所有的被checked的叶子节点的id

    我们可以利用这个方法来查找所有被选中的叶子节点,并收集它们的ID。 ```javascript tree.on('checkchange', function(node) { var checkedIds = ""; // 遍历所有节点 tree.root.cascade(function(node1) { if...

    ext2.0树的增删改

    在实际开发中,为了优化性能,我们可能需要使用平衡树(如AVL树、红黑树)来保持树的高度平衡,以保证查找、插入和删除操作的时间复杂度接近O(logn)。此外,对于大量数据的处理,可以考虑使用B树或B+树,它们更适合...

    Ext_Tree属性方法

    `Ext.tree.TreePanel`是Ext框架中的一个组件,用于创建树形结构的数据展示。它提供了丰富的配置选项和方法来控制树形结构的行为和外观。 - **root**:定义树的根节点。此属性为必须设置。 - **rootVisible**:指定...

    B树-B+树-B*树谈到R树

    - **所有关键字都出现在叶子节点**:B+树的非叶子节点只包含指向子节点的指针,所有的关键字都存储在叶子节点中。 - **相邻叶子节点之间通过指针相连**:这样的设计使得范围查询更加高效。 - **更高的扇出度**:每个...

    B+ Tree 增删改查 可视化

    文件系统如ext4也采用B+ Tree作为文件系统的i-node索引结构,以优化文件的查找和读取速度。 综上所述,B+ Tree是一种高效的索引数据结构,尤其适合处理大数据量的场景。通过可视化工具,我们可以更直观地理解和学习...

    高度平衡的二叉树.zip

    2. 文件系统:如EXT3、EXT4等Linux文件系统采用B树或B+树进行文件的存储和查找。 3. 编译器符号表:编译器在处理源代码时,会用到平衡二叉树来存储符号表,快速查找和更新符号信息。 4. 缓存系统:在缓存系统中,...

    B_Tree1.rar_MáS_b tree java_tttee1.com

    3. 存储结构:B树的所有子节点都存储在叶子节点中,非叶子节点通常存储键值和指向子节点的指针。 4. 数据分布:B树的键值在树中按顺序分布,使得查找、插入和删除操作可以在对数时间内完成。 在实际应用中,B树被...

    extjs 总结

    - `selModel`: 选择模型,定义了用户如何选择树中的节点,默认是 `Ext.tree.DefaultSelectionModel`。 - `pathSeparator`: 分隔树节点路径的字符,默认为 "/"。 - `singleExpand`: 是否只能一次展开一个节点,...

    408Q&A.docx

    - **B+树**:所有叶子结点中保存实际的数据或指针,广泛用于数据库索引结构。 #### 10. 红黑树与平衡二叉树的应用场景 - **红黑树**:在插入和删除操作时自动调整以保持平衡,适合动态数据结构。 - **平衡二叉树**...

    extjs TreePanel

    EXTJS中的TreePanel是用于展示层级数据的组件,它以树状结构呈现数据。TreePanel提供了丰富的配置项和方法...同时,`Ext.data.Node`提供了处理节点关系的方法,如添加、删除和查找子节点,方便进行树结构的操作和维护。

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -重新设计模拟树的下拉列表的实现,避免选中某项后的闪烁。 +2009-11-21 v2.1.5 +Tree优化。 -修正Expanded项和Checked项的状态在回发改变后不能保持的BUG。 -GetNodeById更名为FindNode,保持和...

    入门基础学习 ExtJS笔记(一)

    `root`节点定义了初始的树结构,包括多个子节点,每个节点都有`text`(文本)和`leaf`(是否为叶子节点)属性。 西部区域的`listeners`配置项监听树节点的点击事件,当点击节点时,会执行相应的函数。这个函数首先...

    OS.rar_文件管理_文件管理系统

    这种结构类似一棵倒置的树,根目录位于顶部,下层分支为子目录,叶子节点是具体文件。通过路径(如C:\Users\Username\Documents\file.txt)可以唯一标识一个文件的位置。 六、文件的备份与恢复 文件管理系统还支持...

    ExtAspNet_v2.3.2_dll

    -重新设计模拟树的下拉列表的实现,避免选中某项后的闪烁。 +2009-11-21 v2.1.5 +Tree优化。 -修正Expanded项和Checked项的状态在回发改变后不能保持的BUG。 -GetNodeById更名为FindNode,保持和...

    阿里面试集锦

    红黑树是一种自平衡的二叉查找树,具有以下特点: 1. **颜色属性**:每个节点都带有颜色属性,可以是红色或黑色。 2. **根节点**:根节点必须是黑色。 3. **叶子节点**:所有叶子节点(NIL节点,空节点)都是黑色的...

    阿里Java最新版面试集锦

    红黑树是一种自平衡二叉查找树,其特点包括: 1. **颜色属性**:每个节点要么是红色,要么是黑色。 2. **根节点**:根节点必须是黑色。 3. **叶子节点**:所有叶子节点(即空节点)都被认为是黑色的。 4. **红色...

    嵌入式笔试题(包括嵌入式常考题型)

    4. **数据结构与算法**:笔试题中可能会包含链表、树、图、队列、栈等数据结构的应用问题,以及排序、查找等基本算法的实现。 5. **嵌入式系统设计**:如何进行硬件选型、系统集成、电源管理、功耗优化等。 6. **...

Global site tag (gtag.js) - Google Analytics