`
ckf53390
  • 浏览: 28398 次
文章分类
社区版块
存档分类
最新评论

Extjs TreeFilter 根据关键字过滤树

 
阅读更多

jQuery MiniUI 开发教程 树形控件 树操作:过滤树(十一)

过滤树           

                   

参考示:过滤树

 

 

                       

filter节点过滤          

 

tree.filter(function (node) {

    var text = node.text ? node.text.toLowerCase() : "";

    if (text.indexOf(key) != -1) {

        return true;

    }

});

          

clearFilter取消过滤         

 

tree.clearFilter();

 

Ext 树过滤 tree filter 多余 二级目录 bug 问题

出处:http://blog.sina.com.cn/s/blog_68141ec50100juhn.html

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;

       }

    }

修改二与修改一是有区别的,并且修改二不能取代修改一,因为,修改一也有应用点,如:如果只让用户对叶子进行搜索那么应该是当搜索枝干时应该没有结果,若用修改二则不很好,用修改一更合理

 

 

var tbar = new Ext.Toolbar({  

                buttonAlign : 'center',  

                items : [{xtype : 'textfield',emptyText : '根据企业名称检索企业...',id:'filter_input',width : 200}]  

            });  

  

this.userTreepanel = new Ext.tree.TreePanel({  

             renderTo : 'tree_menu_'+this.pageId,  

             region:'north',  

             title:'用能单位树',  

             split:true,  

             width: 210,  

             tbar : tbar,  

             height : (this.getBodyHeight(0)-10),  

             collapsible: false,  

             margins:'5 0 5 0',  

             loader: this.treeLoader,  

             rootVisible:true,  

             lines: false,  

             singleClickExpand : true,  

             autoScroll:true,  

             root: new Ext.tree.AsyncTreeNode({text:"企业树",id:'-1',expanded:true}),  

            listeners: {              

                   'click' : function(node,e) {  

                        Main.getPageControler().treeNodeClicked(node);  

                        Main.getPageControler().commit(node);  

                   }  

            }        

         });  

           

         var tree = this.userTreepanel;  

         var filter = new Ext.tree.TreeFilter(tree, {  

                clearBlank : true,  

                autoClear : true  

            });  

          

         // 保存上次隐藏的空节点  

         var hiddenPkgs = [];  

         var field = Ext.get('filter_input');  

         field.on('keyup', function(e) {  

            var text = field.dom.value;  

  

                // 先要显示上次隐藏掉的节点  

                Ext.each(hiddenPkgs, function(n) {  

                            n.ui.show();  

                        });  

  

                // 如果输入的数据不存在,就执行clear()  

                if (!text) {  

                    filter.clear();  

                    return;  

                }  

                tree.expandAll();  

  

                // 根据输入制作一个正则表达式,'i'代表不区分大小写  

                var re = new RegExp(Ext.escapeRe(text), 'i');  

                filter.filterBy(function(n) {  

                            // 只过滤叶子节点,这样省去枝干被过滤的时候,底下的叶子都无法显示  

                            return !n.isLeaf() || re.test(n.text);  

                        });  

  

                // 如果这个节点不是叶子,而且下面没有子节点,就应该隐藏掉  

                hiddenPkgs = [];  

                tree.root.cascade(function(n) {  

                            if (!n.isLeaf() && n.ui.ctNode.offsetHeight < 3) {  

                                n.ui.hide();  

                                hiddenPkgs.push(n);  

                            }  

                        });  

         });

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    根据输入的关键字过滤ext树节点

    本篇文章将深入探讨如何根据输入的关键字过滤Ext树节点,类似于MyEclipse中的preferences搜索框功能。 首先,理解“树节点过滤”(Tree Node Filtering)的概念。在ExtJS的树视图中,过滤功能允许用户通过输入...

    ExtJS grid过滤操作

    本篇将深入探讨ExtJS Grid的过滤操作,以及如何动态地对本地store进行筛选。 1. **Grid过滤基础** - **Filter Model**:ExtJS Grid中的过滤功能基于Filter Model。每个列都可以有自己的过滤器,用户可以根据需要...

    EXTJS过滤树

    EXTJS过滤树是一种在EXTJS框架中实现的高级特性,主要用于增强树形组件的功能,让用户能够更高效地浏览和操作大量的层次数据。在EXTJS中,树形组件(TreePanel)通常用于展示具有层级关系的数据,例如组织结构、文件...

    ExtJs Filter 表格过滤

    在ExtJs中,"Filter"功能是用来处理数据网格(Grid)中的数据过滤,它允许用户根据特定条件快速筛选和查找所需信息。表格过滤是提高用户体验和数据管理效率的重要工具,尤其在处理大量数据时。 在"ExtJs Filter ...

    ExtJS Filter 实现表格过滤

    ExtJS Grid还支持组合过滤,即同时应用多个过滤器,可以通过`filters`配置项定义一组过滤规则,Grid将根据这些规则同时筛选数据。 **6. 状态保存与恢复** 为了提高用户体验,可以实现过滤状态的保存与恢复,例如在...

    extjs 树 搜索

    总的来说,EXTJS的树形搜索功能是通过结合TreePanel、TreeStore和过滤机制实现的,它提供了灵活的搜索选项,能够满足不同场景下的数据查找需求。通过深入理解和运用这些知识点,我们可以构建出功能强大、用户体验...

    extjs增删改查分页树

    extjs增删改查分页树

    Extjs自定义组件-下拉树

    ### Extjs自定义组件——下拉树:深入解析与实现 在现代Web开发中,Extjs作为一款功能强大且灵活的框架,深受开发者喜爱。它提供了丰富的UI组件库,能够帮助开发者快速构建复杂的用户界面。其中,自定义组件是Extjs...

    EXT TreeFilter 插件

    EXT TreeFilter插件是EXT库中的一个强大工具,主要用于增强EXT的Tree组件的功能,特别是针对树形结构数据的快速搜索和过滤。EXT Tree是EXT框架中用于展示层次结构数据的组件,它通常用于构建具有多级目录结构的应用...

    extjs 可编辑的表格树 Ext.tree.ColumnTree Ext.tree.ColumnTreeEditor

    extjs 可编辑的表格树,每个单元格自定义编辑组件,可以自适应列宽,只有源码与例子,运行实例要修改路径,不然图片不能显示,注意etree.jsp的js引入路径 支持Ext2.x以上版本 如运行不了EmailTo : codeme9@gmail....

    Extjs图片上传 带过滤和缩略图

    ExtJS提供了丰富的组件和布局选项,你可以根据需求调整界面设计。 8. **异步上传**: 考虑使用Ajax进行异步上传,这样用户可以在等待上传完成的同时继续使用应用的其他功能。你可以利用ExtJS的`Ajax`类或`form....

    extjs异步树,多选树,json数据机构,集成spring,struts例子

    extjs异步树,多选树,json数据机构,集成spring,struts例子,extjs异步树,多选树,json数据机构,集成spring,struts例子,extjs异步树,多选树,json数据机构,集成spring,struts例子,extjs异步树,多选树,json...

    Extjs4.2 Grid filter Demo 表格过滤实验

    这是利用sencha cmd 生成的GridFilterDemo工程中的app和build文件夹,其余文件过大并且与主题无关,因此未包含。具体方法,请参看我的博客: 《Extjs4.2 Grid Filter Feature 表格过滤特性》

    extjs4 实现下拉树并支持复选

    在EXTJS4中,实现一个下拉树(Combobox Tree)并支持多选和复选功能,主要是通过自定义组件(Ext....在实际开发中,可以将此组件引入到你的EXTJS应用中,然后根据项目的实际数据模型和业务逻辑进行相应的定制和扩展。

    EXTJS动态树支持checkbox 全选

    标题中的“EXTJS动态树支持checkbox全选”指的是EXTJS中树组件的一个特性,即在树形结构中添加复选框(checkbox)功能,并支持全选和全取消选中操作。这样的功能对于需要用户进行多项选择的场景非常有用,比如文件...

    Extjs下拉多选树

    7. **事件处理**:ExtJS提供丰富的事件系统,例如`checkchange`事件可以在节点的复选状态改变时触发,使得开发者可以根据用户的选择进行相应的业务逻辑处理。 8. **API配置**:使用ExtJS API可以进一步定制组件的...

    extjs实现动态树

    ExtJS 是一个强大的JavaScript 框架,专用于构建富客户端Web应用程序。它提供了一整套组件库,包括用于创建复杂布局、数据绑定、...在实际开发中,应根据项目需求和性能考虑,合理配置和优化动态树的相关属性和行为。

    ExtJs4.2下拉树(修改版)

    ExtJs4.2没有直接提供下拉树这个组件,但是有例子可以用,文件位置:ext-4.2.1.883\examples\ux\TreePicker.js 但是它有点小毛病吧:默认显示了根节点;达到最小高度时再展开节点,高度不能自动调整。 所以我做了一...

    树结点过滤 拼或者汉字都可以

    总之,"树结点过滤 拼或者汉字都可以 TreeFilter"涉及到的是在JavaScript环境中,特别是使用ExtJS等库时,如何利用`TreeFilter`功能来实现在树形结构中对节点的拼音或汉字过滤,提高用户在操作树形数据时的效率和...

    Extjs2分页树 带查询功能

    同时,如果实现了查询功能,服务器还需要能够根据查询条件过滤数据。 综上所述,"Extjs2分页树 带查询功能"是一个复杂的实现,需要对ExtJS的组件、存储、数据模型以及异步加载机制有深入理解。通过这个实现,开发者...

Global site tag (gtag.js) - Google Analytics