游乐游手机版
首页/前端开发/文章详情

Extjs中ComboBoxTree自定义下拉框树效果完整实现代码示例

时间:2026-06-10 06:59
近期在项目中遇到了一个需求:需要实现一个带树形结构的 ComboBox 下拉框,即 Extjs 树形下拉框。先来看一下最终效果——这种功能在 Extjs 原生组件中并不存在,必须自行开发。通过网络调研,参考了多位开发者的实现思路,结合自己的理解进行整合,最终封装成了 Ext ux TreeCombo

近期在项目中遇到了一个需求:需要实现一个带树形结构的 ComboBox 下拉框,即 Extjs 树形下拉框。先来看一下最终效果——这种功能在 Extjs 原生组件中并不存在,必须自行开发。通过网络调研,参考了多位开发者的实现思路,结合自己的理解进行整合,最终封装成了 Ext.ux.TreeCombo 自定义组件。以下是完整代码,可直接复制使用。

复制代码 代码如下:

Ext.ux.TreeCombo = Ext.extend(Ext.form.ComboBox, { constructor: function (cfg) { cfg = cfg || {}; Ext.ux.TreeCombo.superclass.constructor.call(this, Ext.apply({ maxHeight: 300, editable: false, mode: 'local', triggerAction: 'all', rootVisible: false, selectMode: 'all' }, cfg)); }, store: new Ext.data.SimpleStore({ fields: [], data: [[]] }), // 重写onViewClick,使展开树结点是不关闭下拉框 onViewClick: function (doFocus) { var index = this.view.getSelectedIndexes()[0], s = this.store, r = s.getAt(index); if (r) { this.onSelect(r, index); } if (doFocus !== false) { this.el.focus(); } }, tree: null, // 隐藏值 hiddenValue: null, getHiddenValue: function () { return this.hiddenValue; }, getValue: function () { //增加适用性,与原来combo组件一样 return this.hiddenValue; }, setHiddenValue: function (code, dispText) { this.setValue(code); Ext.form.ComboBox.superclass.setValue.call(this, dispText); this.hiddenValue = code; }, initComponent: function () { var _this = this; var tplRandomId = 'deptcombo_' + Math.floor(Math.random() * 1000) + this.tplId this.tpl = "

" this.tree = new Ext.tree.TreePanel({ border: false, enableDD: false, enableDrag: false, rootVisible: _this.rootVisible || false, autoScroll: true, trackMouseOver: true, height: _this.maxHeight, lines: true, singleExpand: true, root: new Ext.tree.AsyncTreeNode({ id: _this.rootId, text: _this.rootText, iconCls: 'ico-root', expanded: true, leaf: false, border: false, draggable: false, singleClickExpand: false, hide: true }), loader: new Ext.tree.TreeLoader({ nodeParameter: 'ID', requestMethod: 'GET', dataUrl: _this.url }) }); this.tree.on('click', function (node) { if ((_this.selectMode == 'leaf' && node.leaf == true) || _this.selectMode == 'all') { if (_this.fireEvent('beforeselect', _this, node)) { _this.fireEvent('select', _this, node); } } }); this.on('select', function (obj, node) { var dispText = node.text; var code = node.id; obj.setHiddenValue(code, dispText); obj.collapse(); }); this.on('expand', function () { this.tree.render(tplRandomId); }); Ext.ux.TreeCombo.superclass.initComponent.call(this); } }) Ext.reg("treecombo", Ext.ux.TreeCombo);

组件开发完成后,需要在主页面中引入必要的 Extjs 类库文件。请注意引入顺序与文件路径的准确性:

复制代码 代码如下:

其中 login.js 文件包含了业务逻辑代码,以下为核心代码片段(完整实现请根据实际项目需求进行调整):

复制代码 代码如下:

/* File Created: 五月 27, 2013 */ Ext.onReady(function () { var _window = new Ext.Window({ title: "查询条件", renderTo: Ext.getBody(), frame: true, plain: true, buttonAlign: "center", closeAction: "hide", maximizable: true, closable: true, bodyStyle: "padding:20px", width: 350, height: 300, layout: "form", lableWidth: 110, defaults: { xtype: "textfield", width: 180 }, // ... 此处省略窗口内的具体组件配置,实际使用时根据需求补充 }); });

至此,文章开头展示的树形下拉框效果便成功实现。该组件的核心实现思路如下:基于 Ext.form.ComboBox 进行扩展,在组件展开时动态渲染一个 TreePanel 到下拉框的模板区域中;通过重写 onViewClick 方法,防止展开树节点时意外关闭下拉框;同时监听树节点的点击事件,用于设置隐藏值和显示文本。

Extjs中ComboBoxTree实现的下拉框树效果(自写)

来源:https://www.jb51.net/article/37497.htm
上一篇在Ext JS 4.0.7框架中getValue与getRawValue两个方法之间的区别详细解析 下一篇ExtJS4.0中数据存储的查找记录方法缺陷演示代码
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
HTML文档版权声明结构与基础脚手架代码质量解析
前端开发 · 2026-07-07

HTML文档版权声明结构与基础脚手架代码质量解析

版权声明需用语义化``标签,©符号使用`©`实体;年份通过服务端、构建或JS分层兜底;`rel= "license "`仅指向真实许可证文件才有效。

基于HTML模板的组件化全栈交互方案
前端开发 · 2026-07-07

基于HTML模板的组件化全栈交互方案

纯HTML模板仅作静态结构,全栈交互需后端注入数据、前端JS激活模板及用户事件触发双向链路。``标签惰性,不执行脚本或加载资源,需通过克隆填充数据并手动绑定事件实现交互,父子传值依赖JS对象与自定义事件。

Bootstrap修改Badge徽章边框为圆点样式的方法
前端开发 · 2026-07-07

Bootstrap修改Badge徽章边框为圆点样式的方法

将BootstrapBadge改为圆点:自定义类设置等宽高、border-radius:50%、padding:0、font-size:0;Bootstrap5 2+需加display:inline-block;注意垂直对齐,避免min-width干扰,背景色用background-color更可控。

Bootstrap响应式多栏Footer社交图标排版实现
前端开发 · 2026-07-07

Bootstrap响应式多栏Footer社交图标排版实现

使用Bootstrap5的grid系统实现响应式多栏Footer,按断点设置列宽;以FontAwesome处理社交图标,避免使用img;利用list-unstyled组织链接列表;借助flex-column容器配合mt-auto使版权行自动贴底,避免fixed-bottom固定定位的弊端。

如何用Shadow DOM隔离组件内外事件分发
前端开发 · 2026-07-07

如何用Shadow DOM隔离组件内外事件分发

ShadowDOM内部事件默认不穿透影子边界,需显式设置composed:true才能被外部监听。此时event target指向宿主元素,真实触发源需通过event composedPath()[0]获取。原生事件手动派发时也必须声明composed:true。应避免在宿主上依赖event target做逻辑分支,建议在shadowroot内绑定事件或使用