Extjs treePanel过滤查询功能

 Extjs4.2中,对于treeStore中未实现filterBy函数进行实现,treestore并未继承与Ext.data.Store,对于treePanel的过滤查询功能,可有以下两种实现思路:

一:FilterBy函数

实现思路:

1)对于treestore 结构类型,extjs提供了专门的迭代函数cascadeBy函数,用于对树型节点进行迭代

2)迭代树型结构,在回调函数中,判断是否存在所查询内容,如果存在,将节点的id数组里。

3)再次迭代树型结构,将不在数据里的节点进行隐藏。

4)每次查询过程中,将所有节点设置可见。

注:在extjs中,对于界面元素的操作,可利用Ext.dom.Element对界面元素dom进行显示操作。

首先定义一个类'MyExtend.lib.TreeFilter'

/**
 * Created by bcm on 14-6-30.
 */
Ext.define('Juliet.util.TreeFilter', {
    filterByText: function(text) {
        this.filterBy(text, 'text');
    },
    /**
     * 根据字符串过滤所有的节点,将不符合条件的节点进行隐藏.
     * @param 查询字符串.
     * @param 要查询的列.
     */
    filterBy: function(text, by) {
        debugger;
        this.clearFilter();

        var view = this.getView(),
            me = this,
            nodesAndParents = [];

        // 找到匹配的节点并展开.
        // 添加匹配的节点和他们的父节点到nodesAndParents数组.
        this.getRootNode().cascadeBy(function(tree, view) {
            var currNode = this;

            if (currNode && currNode.data[by] && currNode.data[by].toString().toLowerCase().indexOf(text.toLowerCase()) > -1) {
                me.expandPath(currNode.getPath());

                while (currNode.parentNode) {
                    nodesAndParents.push(currNode.id);
                    currNode = currNode.parentNode;
                }
            }
        }, null, [me, view]);

        // 将不在nodesAndParents数组中的节点隐藏
        this.getRootNode().cascadeBy(function(tree, view) {
            var uiNode = view.getNodeByRecord(this);

            if (uiNode && !Ext.Array.contains(nodesAndParents, this.id)) {
                Ext.get(uiNode).setDisplayed('none');
            }
        }, null, [me, view]);
    },


    clearFilter: function() {
        var view = this.getView();
        this.getRootNode().cascadeBy(function(tree, view) {
            var uiNode = view.getNodeByRecord(this);

            if (uiNode) {
                Ext.get(uiNode).setDisplayed('table-row');
            }
        }, null, [this, view]);
    }
});


  接下来定义一个你自己的treepanel,并混入这个类

1
2
3
4
5
Ext.define( 'MyTreePanel' ,{
     extend: 'Ext.tree.Panel' ,
     mixins:[ 'MyExtend.lib.TreeFilter' ]
     
});

调用方法:treepanel.filterByText('xxx') 或treepanel.filterBy('xxx','列名') 进行过滤查询

实现结果图:


二:searchTables函数

实现思路:

1)循环迭代树型结构,利用正则表达式进行匹配,对于匹配的节点进行展开并选中。

2)再以此迭代节点的子节点,匹配节点进行展开并选中。

// treepanel 模糊查询 ,展开树型结构,选中匹配项
function searchTables(tree,value){
    tree.forEach(function(e){
        var content = e.raw.text;
        var re = new RegExp(Ext.escapeRe(value), 'i');
        if(re.test(content)||re.test(content.toUpperCase())){
            e.parentNode.expand();
            var tabllepanel=Ext.ComponentQuery.query('auditruleview treepanel[name=dataTables]')[0];
            var selModel = tabllepanel.getSelectionModel();
            selModel.select(e,true);
            if(!e.isLeaf()){
                e.expand();
            }
        }
         searchTables(e.childNodes,value);
    });
}

实现效果图:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值