Extjs6 Tree 树数据筛选

2023-05-16

前端使用ExtJS6,要求在菜单树上对菜单树的数据进行筛选,提高用户的体验。

现在功能已经完成,这里记录下来便于后面遇到类似问题作为参考,会贴上源码和官方Demo提供参考的源码。

对Tree的筛选,有两种情况 ,一种是Tree的DataSource已经加载完毕,和Tree进行了互相绑定,不在进行改变。这种情况的效果如下:

154902_Awio_1766974.png

代码如下:

{
	xtype : 'treepanel', //使用treepanel
	region : 'west',  //定位
	reference : 'fileTreeObj',  //命名
	// height:window.innerHeight*0.8-210,  //随着外部容器大小变动
	height : 470,
	flex : 1,
	rootVisible : false, // 是否显示根节点
	bind : {
		store : '{salaryItemTree}'
	} // 数据源
	,
	listeners : {
		itemclick : 'onSalaryItemTreeNodeClick'  //监听树选择事件。忽略。。
	},
	tbar : [{ //树上增加tbar工具栏
		xtype : 'triggerfield', 
		emptyText : '按名称查找筛选', //提示语
		width : 150,
		triggerCls : 'x-form-search-trigger', // 放大镜图标。可不需要
		onTriggerClick : function() {
			this.reset(); 
		},
		listeners : {
			change : function() {
				var tree = this.up('treepanel'), v, matches = 0;
				try {
					v = new RegExp(this.getValue(), 'i');
					Ext.suspendLayouts();
					tree.store.filter({
						filterFn : function(node) {
							var children = node.childNodes, 
							len = children && children.length, 
							visible = node.isLeaf() ? v.test(node.get('text')) : false, i;
							for (i = 0; i < len && !(visible = children[i].get('visible')); i++);
							if (visible && node.isLeaf()) {
								matches++;
							}
							return visible;
						},
						id : 'titleFilter'
					});
					tree.down('#matches').setValue(matches);
					Ext.resumeLayouts(true);
				} catch (e) {
					this.markInvalid('无匹配数据');
				}
			},
			buffer : 500
			// 延时
		}
	}, {
		//匹配项显示内容。可隐藏。不可删除,删除需要对上面的change事件进行调整。
		xtype : 'displayfield',
		itemId : 'matches',
		fieldLabel : '匹配项', 
		width : 100,
		labelWidth : 50,
		listeners : {
			beforerender : function() {
				var me = this, tree = me.up('treepanel'), 
				root = tree.getRootNode(), 
				leafCount = 0; //默认0个匹配项
				tree.store.on('fillcomplete', function(store, node) {
					if (node === root) {
						root.visitPostOrder('',function(node) {
							if (node.isLeaf()) {
								leafCount++;
							}
						});
						me.setValue(leafCount);
					}
				});
			},
			single : true
			}
		}]
	}

其中tree的DataSource为初始化绑定上去的。

可在获取数据源后,迭代添加到treepanel控件上。迭代生成菜单树。具体根据数据来。这里只是参考。

//生成公式树
    createSalaryItemTree:function(result){
    	var me = this, view = me.getView(), vm = me.getViewModel();
    	
		var salaryItemTree = vm.getStore('salaryItemTree');
		var itemTreeRoot = salaryItemTree.getRoot();
		
		//清除树
		itemTreeRoot.removeAll();
		
		//调用方法获取树的其他信息
		Ext.each(result, function (record) {
			var childrenData = record.children;
			itemTreeChild = itemTreeRoot.appendChild({text:record.ItemName, id:record.ItemID, 
							leaf:record.isLeaf, expanded: false,categoryID:record.categoryID,categoryName:record.categoryName,
							isRootNode:record.isRootNode, comboData:record.comboData });
			if(childrenData != null){
	    		me.addSalayTreeChild(itemTreeChild,childrenData);
	    	}
		})
    },
    //递归生成菜单树
    addSalayTreeChild:function(child,childrenData){
    	var me = this;
    	Ext.each(childrenData,function(data){
    		var childrenData = data.children;
    		var child_Child = child.appendChild({text:data.ItemName, id:data.ItemID, leaf:data.isLeaf, expanded: false,
    								categoryID:data.categoryID,categoryName:data.categoryName,
    								isRootNode:data.isRootNode, comboData:data.comboData});
    		if(childrenData != null){
		    	me.addSalayTreeChild(child_Child,childrenData);
		    }
    	})
    }

当然。官方Demo的源码少不了的。有兴趣可以研究一下。

 tbar: [{
        labelWidth: 130,
        xtype: 'triggerfield',
        fieldLabel: 'Filter on thread title',
        triggerCls: 'x-form-clear-trigger',
        onTriggerClick: function() {
            // Will trigger the change listener
            this.reset();
        },
        listeners: {
            change: function() {
                var tree = this.up('treepanel'),
                    v,
                    matches = 0;

                try {
                    v = new RegExp(this.getValue(), 'i');
                    Ext.suspendLayouts();
                    tree.store.filter({
                        filterFn: function(node) {
                            var children = node.childNodes,
                                len = children && children.length,

                                // Visibility of leaf nodes is whether they pass the test.
                                // Visibility of branch nodes depends on them having visible children.
                                visible = node.isLeaf() ? v.test(node.get('title')) : false,
                                i;

                            // We're visible if one of our child nodes is visible.
                            // No loop body here. We are looping only while the visible flag remains false.
                            // Child nodes are filtered before parents, so we can check them here.
                            // As soon as we find a visible child, this branch node must be visible.
                            for (i = 0; i < len && !(visible = children[i].get('visible')); i++);

                            if (visible && node.isLeaf()) {
                                matches++;
                            }
                            return visible;
                        },
                        id: 'titleFilter'
                    });
                    tree.down('#matches').setValue(matches);
                    Ext.resumeLayouts(true);
                } catch (e) {
                    this.markInvalid('Invalid regular expression');
                }
            },
            buffer: 250
        }
    }, {
        xtype: 'displayfield',
        itemId: 'matches',
        fieldLabel: 'Matches',

        // Use shrinkwrap width for the label
        labelWidth: null,
        listeners: {
            beforerender: function() {
                var me = this,
                    tree = me.up('treepanel'),
                    root = tree.getRootNode(),
                    leafCount = 0;

                tree.store.on('fillcomplete', function(store, node) {
                    if (node === root) {
                        root.visitPostOrder('', function(node) {
                            if (node.isLeaf()) {
                                leafCount++;
                            }
                        });
                        me.setValue(leafCount);
                    }
                });
            },
            single: true
        }
    }]

 

转载于:https://my.oschina.net/niaoge/blog/1635938

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Extjs6 Tree 树数据筛选 的相关文章

  • 复选框树

    我正在寻找 Javascript 的 复选框树 小部件 我尝试使用jquery 检查树 http jquery checktree googlecode com 其声称完全符合我的要求 但它存在以下问题 它无法识别已选中的复选框 并将所有内
  • 范围内的第 K 个最小值

    给定一个整数数组和一些查询操作 查询操作有2种类型1 将第i个索引的值更新为x 2 给定 2 个整数 找到该范围内的第 k 个最小值 例如 如果 2 个整数是 i 和 j 我们必须找出 i 和 j 之间的第 k 个最小值 我可以使用线段树找
  • 在Python中生成字典树中的所有叶到根路径

    我有一个 非标准 形式的字典树 如下所示 tree 0 A B C D E F 叶节点被定义为字典键值对 其中值是空字典 我想将所有叶到根路径提取为列表列表 如下所示 paths C B A 0 E D 0 F D 0 如果有帮助的话 也可
  • Tidyverse 重复跟踪父 ID 直到祖先的方法

    来自 Rebrickable 的主题数据集 https rebrickable com downloads 包括每个主题的 ID 及其父 ID 此处已重命名列 可能会递归 ID 可能有祖父母 曾祖父母等 这是一个遵循父链 City gt A
  • 对整数树求和 (Haskell)

    我正在尝试创建一个对非二叉整数树的值求和的函数 datastructures hs data Tree a Empty Node a Tree a deriving Eq Show myNums Num a gt Tree a myNums
  • 基于级别的嵌套数组

    0 content Heading 1 2 3 4 5 level 2 anchor heading 1 2 3 4 5 className testtest fontWeight 1 content Heading 2 level 2 a
  • B 树和 2-3-4 树之间的区别

    B 树和 2 3 4 树有什么区别 另外 你如何找到每个的最大和最小高度 链接到维基百科 http en wikipedia org wiki 2 3 4 tree and引用 2 3 4 树是 4 阶 B 树 A 2 3 4 is a B
  • 获取图表中走过的最长路线

    我有一组相互连接的节点 我有以下节点网络 这里0是起点 我想遍历尽可能多的节点 并且一个节点只遍历一次 另外 在从 0 到目标节点的旅程中 我只想有一个奇数编号的节点 如 1 3 5 7 现在我需要找出从起始位置 0 开始可以行驶的最长路线
  • 如何查看 SVN 中文件的版本树,显示从分支到主干的合并?

    我是 SVN 新手 但已经使用 Clearcase 多年 我的问题是我对一个分支进行了一些更改 我已使用 TortoiseSVN 重新集成分支 功能将其合并回主干 现在 当我查看版本树时 我没有看到从分支尖端到树干尖端渲染的任何边缘 这是我
  • 构建具有继承的通用树

    我正在构建一个通用的Tree
  • Visual Studio代码侧边栏垂直引导线(自定义侧边栏)

    有人知道 Visual Studio 代码的扩展可以像 netbeans 一样在侧边栏 用于文件和文件夹 上显示垂直指南吗 或者vscode中有一些设置吗 Netbeans 快照 https i stack imgur com CFJsw
  • 迭代多级提升树

    我的树看起来像这样 Library L ID 1 Book B ID 1 Title Moby Dick Book B ID 2 Title Jurassic Park Library L ID 2 Book B ID 1 Title Ve
  • 寻找成熟的 M-Tree 实现 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个成熟的 java M Tree 实现 甚至任何 M Tree 实现 除了我找到的唯一实现 http en wikipedia
  • Beaglebone Black 上的 GPIO

    我目前遇到了 Beaglebone black GPIO 引脚的问题 我正在寻找一种正确的方法来读取 C 中的 GPIO 引脚 p8 4 的值 如果我理解正确的话 我尝试使用一个库 该库使用了在引入设备树之前不支持的旧方法 我尝试寻找其他解
  • 将数据库结果转为数组

    我刚刚为组织查询分层数据的 闭包表 方式制作了更新 添加 删除部分 如本幻灯片第 70 页所示 http www slideshare net billkarwin sql antipatterns strike back http www
  • Java hibernate/jpa 如何创建自相关的动态通用实体

    我想使用 JPA hibernate 创建动态和通用的超类 它将针对每个层次结构模型进行扩展 例如 角色 页面 目录 部门 权限 树 我想使用递归和java反射来创建这个对象动态树 它应该看起来像这样 该实体应该引用自身实体 我希望它是完全
  • 如何使用KDTrees实现最近邻搜索?

    所以 我正在实施一个KD Tree http en wikipedia org wiki Kd tree进行最近邻搜索 我已经构建了树部分 但我认为我没有完全理解搜索部分 关于遍历树来搜索邻居 维基百科文章如下 Starting with
  • Webix 树节点的 Font Awesome 图标

    Webix 与 Font Awesome 集成 http docs webix com desktop icon types html 但是如何使用 Font Awesome 图标代替树中的默认文件夹 文件图标来设置各个节点的样式呢 这是我
  • O(1) 算法确定节点是否是多路树中另一个节点的后代?

    想象一下下面的树 A B C D E F 我正在寻找一种方法来查询 F 是否是 A 的后代 注意 F 不需要是directA 的后代 在这种特殊情况下这是正确的 只需要针对更大的潜在后代节点池测试有限数量的潜在父节点 当测试一个节点是否是潜
  • 如何展平解析树并存储在字符串中以进行进一步的字符串操作 python nltk

    我正在尝试从树结构中获取扁平树 如下所示 我想将整个树放在一个字符串中 就像没有检测到坏树错误一样 S NP SBJ NP DT The JJ high JJ seven day PP IN of NP DT the CD 400 NNS

随机推荐

  • C++实现flatten:扁平化容器的容器的容器。。。

    zip map reduce flatten是比较有意思的通用算法 zip在boost iterator里有了 xff0c map reduce是用transfom accumulate inner product实现的 flatten就没
  • C++模仿python的装饰器功能

    C 43 43 固有语法限制 xff0c 导致能模仿功能 xff0c 但是无法模仿语法 function lt int int gt f 61 int x return x DECORATOR f pre post 被装饰的函数必须使用fu
  • 《Modern C++ Design》Loki库源码读解随想

    Modern C 43 43 Design Loki 库源码读解随想 大牛 Andrei Alexandrescu 的 Modern C 43 43 Design 讨论的是 C 43 43 语言的最前沿研究 xff1a generative
  • CUJ:标准库:定义iterator和const iterator

    The Standard Librarian Defining Iterators and Const Iterators Matt Austern http www cuj com experts 1901 austern htm top
  • CUJ:高效使用标准库:显式函数模板参数申明与STL

    Effective Standard C 43 43 Library Explicit Function Template Argument Specification and STL A New Language Feature and
  • 正则是如何判断有重复/由不重复的数字组成的串的。

    源自这里 xff1a http bbs csdn net topics 390804087 d 1 这个判断了有重复的数字 原理 xff1a 是非贪婪 xff0c 从最少的数量试起 是0 无穷大次 最小就是0 对于源串 1234567890
  • 《C++程序设计原理与实践》书评

    在2周内 xff0c 以1目10行的速度读过了这本书 小小书评如下 xff1a 这是一本主要面向初学者的极好的教材 在我看过的编程书籍中 xff0c 这是第二本适合于完全无编程经验的初学者的入门书籍 xff08 前面一本叫 C语言解析教程
  • 最近用了一把boost::range,哎,真方便。(水帖)

    难怪有老外大牛写文章 iterator must go 34 stl是该彻底重写了 嗯 xff0c 我的C 43 43 代码越来越向python代码靠拢了
  • 数据库左连接注意点

    left join on 即左连接 xff0c 把left join左边的表的记录全部找出来 进行左连接时 xff0c 就有涉及到主表 辅表 xff0c 这时 主表条件写在 WHERE之后 xff0c 辅表条件写在 ON后面 xff01 x
  • boost::preprocess的神秘魔法的实现细节:BOOST_PP_SEQ_SIZE(SEQ)

    BOOST PP SEQ SIZE还可以展示一下 xff0c BEGIN BOOST PP SEQ FOLD LEFT SUB S 22 SEQ 61 61 10 END直接生产了2 6M的log过程 define SEQ 4 1 5 2
  • windows子系统固定IP和开启ssh

    Windows子系统固定IP地址 一 固定IP地址 windows子系统默认开机会变更随机ip 修改为固定的ip地址 1 获取子系统名 打开cmd或PowerShell输入 wsl l v 显示如图 获得Ubuntu在子系统中名字 Ubun
  • Centos 安装pyspider 必须成功

    Centos安装pyspider踩过的坑 xff01 xff01 xff01 一个接着一个 写在前面的话 xff1a 一直在本地机器小玩玩pyspider xff0c 今天心血来潮linux安排上 网上教程一大堆 xff0c 一个接着一个坑
  • Permutation Test

    常规步骤 xff1a 一般 多组间样本均数的比较是先做正态性检验和方差齐性 xff0c 然后在各组 都满足 正态性和方差齐性的前提下做方差分析 如果数据呈现正态分布 xff0c 但方差不齐 xff0c 则可以选择近似方法 Welch法 和
  • [vuejs] 在vuejs中使用websocket进行实时通讯

    在vuejs框架中使用websocket 可以比较方便的运用到vuejs框架的响应式系统 以及一些简单的生命周期函数 var app 61 new Vue el 39 app 39 data server 34 ws 127 0 0 1 8
  • [nginx] X-Cache: HIT的意思

    请求返回的数据是从缓存里拿到的X Cache HIT 缓存命中了 遇到一个返回接口数据总是不对 xff0c 在看到X Cache HIT才发现 给接口设置了缓存 xff01 xff01 xff01
  • [CSS] CSS display:flex实现内容水平垂直居中展示

    display flex实现内容水平垂直居中展示 需要增加下面两点就能实现 首先父级元素必须有高度 xff0c 没有高度就无法垂直居中 xff0c 如果想全屏垂直居中 xff0c 可以设置高度为100vh 比如body设置为这样 body
  • Java在字符串中查找匹配的子字符串

    示例 xff1a 在源字符串 You may be out of my sight but never out of my mind 中查找 my 的个数 输出 xff1a 匹配个数为2 三种方法 xff1a 1 通过String的inde
  • Ext4 vs XFS——你应该使用哪个文件系统

    运行 Linux 系统的用户几乎不会关注底层文件系统 事实上 xff0c 在安装 Linux 的过程中 xff0c 通常倾向于使用列出的默认文件系统而不探索其他可用选项 对于 Windows xff0c 事情要容易得多 xff0c 因为 N
  • Btrfs 与 Ext4 - 功能、优势和劣势

    文件系统控制从存储设备存储和检索数据的位置 方式和时间 日常系统进程需要一个高效的文件系统 Linux 内核支持多种文件系统 最常用的是 Ext4 Btrfs XFS 和 ZFS xff0c 这是 2018 年发布的最新文件系统 这些文件系
  • Extjs6 Tree 树数据筛选

    前端使用ExtJS6 xff0c 要求在菜单树上对菜单树的数据进行筛选 xff0c 提高用户的体验 现在功能已经完成 xff0c 这里记录下来便于后面遇到类似问题作为参考 xff0c 会贴上源码和官方Demo提供参考的源码 对Tree的筛选