Extjs4.x Ext.tree.Panel 过滤Filter以及trigger field的使用
Extjs4.x中已经取消了组件Ext.Tree.TreeFilter功能,却掉了树形结构的过滤功能,要实现该功能只能自己写了.
Tree节点筛选UI很简单,一个Tbar,一个trigger即可解决问题,剩下的是逻辑代码了。
1.tbar没啥好解析的
2.trigger几个比较重要的属性
triggerCls:文本框右侧的按钮样式,主要有4种
x-form-clear-trigger // the X icon
x-form-search-trigger // the magnifying glass icon
x-form-trigger // the down arrow (default for combobox) icon
x-form-date-trigger // the calendar icon (just in case)
onTriggerClick:单击右侧按钮的事件
emptyText:值为空时候显示的文字
hideTrigger:是否显示触发按钮
更多请参考:http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.form.field.Trigger-cfg-hideTrigger
3.剩下最重要的一个是逻辑处理类
完整的案例代码如下:
Ext.define( "WMS.view.Tree" , { extend: 'Ext.tree.Panel' , alias: 'widget.wmsTree' , id: 'wmsMenuTreePanel' , title: "功能导航" , margins: '0 0 0 3' , width: 200, region: 'west' , animate: true , store: 'VPTreeMenu' , autoScroll: true , rootVisible: false , loadMsg: true , collapsible: true , //是否可以折叠 split: true , tools: [{ type: 'expand' , handler: function () { Ext.getCmp( "wmsMenuTreePanel" ).expandAll(); } }, { type: 'collapse' , handler: function () { Ext.getCmp( "wmsMenuTreePanel" ).collapseAll(); } }],<br> //这里不要忘记 mixins: { treeFilter: 'WMS.view.TreeFilter' }, tbar: [{ xtype: 'trigger' , triggerCls: 'x-form-clear-trigger' , onTriggerClick: function () { this .setValue( '' ); Ext.getCmp( "wmsMenuTreePanel" ).clearFilter(); }, width: '100%' , emptyText: '快速检索功能' , enableKeyEvents: true , listeners: { keyup: { fn: function (field, e) { if (Ext.EventObject.ESC == e.getKey()) { field.onTriggerClick(); } else { Ext.getCmp( "wmsMenuTreePanel" ).filterByText( this .getRawValue()); } } } } }] }); |
/** * Add basic filtering to Ext.tree.Panel. Add as a mixin: * mixins: { * treeFilter: 'WMS.view.TreeFilter' * } */ Ext.define( 'WMS.view.TreeFilter' , { filterByText: function (text) { this .filterBy(text, 'text' ); }, /** * Filter the tree on a string, hiding all nodes expect those which match and their parents. * @param The term to filter on. * @param The field to filter on (i.e. 'text'). */ filterBy: function (text, by) { this .clearFilter(); var view = this .getView(), me = this , nodesAndParents = []; // Find the nodes which match the search term, expand them. // Then add them and their parents to 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]); // Hide all of the nodes which aren't in 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]); } }); |
如果你想对节点的中文做些处理,例如按照拼音首字母进行搜索,只需要变更如下这句代码即可
currNode.data[by].toString().toLowerCase().indexOf(text.toLowerCase()) > -1
更多扩展,可以自己修改类 WMS.view.TreeFilter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架