extjs是一个非常不错的页面显示架构,在扩展页面组件方面也是十分的灵活方便的,我们在项目中有遇到需要在下拉框中显示树形数据供用户单选或者多选的请款,所以我就扩展了其之前的下拉框控件 Ext.form.TriggerField
Ext.ns("Fairies.form");
//支持显示树的下拉选择框
Fairies.form.TreeCombo=Ext.extend(Ext.form.TriggerField,{
defaultAutoCreate:{tag: "input", type: "text", size: "24", autocomplete: "off"},
shadow:'sides',
maxHeight: 300,
hideTrigger:false,
rootVisible:true,
resizable:true,
minListWidth:70,
handleHeight:8,
editable:false,
lazyInit:true,
initComponent:function(){
Fairies.form.TreeCombo.superclass.initComponent.call(this);
this.addEvents('expend','collapse','select');
},
onRender:function(ct, position){
Fairies.form.TreeCombo.superclass.onRender.call(this, ct, position);
if(this.hiddenName){
this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName, id: (this.hiddenId||this.hiddenName)},'before', true);
this.hiddenField.value = this.hiddenValue !== undefined ? this.hiddenValue : this.value !== undefined ? this.value : '';
this.el.dom.removeAttribute('name');
}
this.el.dom.setAttribute('readOnly', true);
this.el.on('mousedown', this.onTriggerClick, this);
this.el.addClass('x-combo-noedit');
this.initTreeLayer();
},
initTreeLayer:function(){
if(!this.treeLayer){
var cls='x-combo-list';
this.list = new Ext.Layer({
shadow: this.shadow, cls: [cls].join(' '), constrain:false
});
var lw = this.listWidth || Math.max(this.wrap.getWidth()-this.trigger.getWidth(), this.minListWidth);
this.list.setWidth(lw);
this.list.swallowEvent('mousewheel');
this.assetHeight = 0;
this.view=new Ext.tree.TreePanel({
applyTo:this.list,
autoScroll:true,
checkModel:this.checkModel,
onlyLeafCheckable:false,
animate:true,
height:100,
rootVisible:this.rootVisible,
containerScroll: true,
loader:new Ext.tree.TreeLoader({
dataUrl:this.dataUrl,
baseAttrs:this.checkModel&&this.checkModel=='cascade'?{uiProvider:Ext.tree.TreeCheckNodeUI}:null
}),
root:new Ext.tree.AsyncTreeNode({id:'0'})
});
this.view.on('click',this.onViewClick,this);
this.view.on('checkchange',this.onCheckChange,this);
this.resizer=new Ext.Resizable(this.list,{
pinned:true,
handles:'se'
});
this.resizer.on('resize',function(r,w,h){
this.view.setHeight(h-this.handleHeight);
},this);
}
},
onTriggerClick : function(){
if(this.disabled){
return;
}
if(this.isExpanded()){
this.collapse();
this.el.focus();
}else {
this.onFocus({});
this.expand();
this.el.focus();
}
},
onViewClick : function(doFocus){
var node=this.view.getSelectionModel().getSelectedNode();
if (this.checkModel&&this.checkModel=='cascade'){//只针对单选和级联多选的处理
this.setValue(this.view.getChecked('id'));
this.collapse();
this.fireEvent('select',this,node);
}else{
if(node){
this.onSelect(node);
}
if(doFocus !== false){
this.el.focus();
}
}
},
onSelect : function(node){
this.setValue(node.id);
this.collapse();
this.fireEvent('select', this, node);
},
setValue : function(id){
if (this.checkModel&&this.checkModel=='cascade'){//只针对单选和级联多选的处理
this.view.getRootNode().expand(true);
if (id.indexOf(',')!=-1)
id=id.split(',');
var text='';
this.view.checkModel='multiple';
var ids=this.view.getChecked('id');
for (i=0;i<ids.length;i++){
var node=this.view.nodeHash[ids[i]]?this.view.nodeHash[ids[i]]:null;
if (node){node.checked=false;node.getUI().check(false)}
}
for (i=0;i<id.length;i++){
var node=this.view.nodeHash[id[i]]?this.view.nodeHash[id[i]]:null;
text+=node?node.text+',':'';
if (node){node.checked=true;node.getUI().check(true)}
}
this.view.checkModel=this.checkModel;
this.hiddenField.value=id;
Fairies.form.TreeCombo.superclass.setValue.call(this,text?text:'');
}else{
this.view.getRootNode().expand(true);
var node = this.view.nodeHash[id];
this.hiddenField.value=id;
Fairies.form.TreeCombo.superclass.setValue.call(this, node?node.text:'');
}
},
onCheckChange:function(node){
if (this.checkModel&&this.checkModel=='cascade'){//只针对单选和级联多选的处理
this.setValue(this.view.getChecked('id'));
}
},
isExpanded : function(){
return this.list && this.list.isVisible();
},
expand : function(){
if(this.isExpanded() || !this.hasFocus){
return;
}
this.list.alignTo(this.wrap, this.listAlign);
this.list.show();
var zindex = Ext.WindowMgr.zseed + 5000;
this.list.setStyle("z-index", zindex.toString());
Ext.getDoc().on('mousewheel', this.collapseIf, this);
Ext.getDoc().on('mousedown', this.collapseIf, this);
this.fireEvent('expand', this);
},
collapse : function(){
if(!this.isExpanded()){
return;
}
this.list.hide();
Ext.getDoc().un('mousewheel', this.collapseIf, this);
Ext.getDoc().un('mousedown', this.collapseIf, this);
this.fireEvent('collapse', this);
},
collapseIf : function(e){
if(!e.within(this.wrap) && !e.within(this.list)){
this.collapse();
}
},
clearValue : function(){
if(this.hiddenField){
this.hiddenField.value = '';
}
setValue('');
this.applyEmptyText();
},
onDestroy : function(){
if(this.view){
this.view.el.removeAllListeners();
this.view.el.remove();
this.view.purgeListeners();
}
if(this.list){
this.list.destroy();
}
Fairies.form.TreeCombo.superclass.onDestroy.call(this);
},
getValue : function(){
if(this.valueField){
return typeof this.value != 'undefined' ? this.value : '';
}else{
return Fairies.form.TreeCombo.superclass.getValue.call(this);
}
}
});
Ext.reg('treeCombo', Fairies.form.TreeCombo);
调用方式:
,{fieldLabel:'用户功能角色',
typeAhead : true,
mode:'local',
triggerAction : 'all',
emptyText:'请选择功能角色',
selectOnFocus : true,
valueField:'id',
displayField:'text',
hiddenName:'funcRoles',
dataUrl:'rbac/function/queryFunRoleManagerDate.action?org_id='+Fairies.userConfig.upperOrgId,
checkModel:'cascade',//single,cascade
xtype:'treeCombo',
allowBlank:false,
rootVisible:false,
width:250
}
显示结果:
- 大小: 13.6 KB
分享到:
相关推荐
树形下拉列表框是一种交互式的用户界面组件,它结合了传统的下拉列表与树状结构的优点,使得用户在选择时能以层级的方式查看和选择数据。这种组件常见于需要展示具有层次关系的数据集合,例如组织结构、地区分类或者...
用户可以输入文本,或者从下拉列表中选择一个预定义的选项。在默认情况下,ComboBox仅支持简单的文本项,但通过自定义控件和模板,我们可以将其功能扩展到包含更复杂的数据结构。 扩展ComboBox的关键在于自定义控件...
在C#编程环境中,`TreeComboBox`控件是一种结合了树形结构和组合框功能的控件,它允许用户在下拉列表中选择一个或多个项,这些项以树状结构呈现。`TreeComboBox`提供了丰富的交互性,使得在用户界面中展示层次数据变...
我们需要确保控件能够正确绑定到数据源,以便在下拉列表中显示树形结构。这通常涉及到ItemSource属性和HierarchicalDataTemplate中的ItemsPath属性。 3. **事件处理**:转换过程中,需要确保所有必要的事件(如打开...
本样例主要聚焦于"组态王下拉式组合框"的使用,这是一个在人机交互界面(HMI)设计中常用的控件,用于提供用户选择项的下拉列表。 1. **下拉式组合框的定义与功能** 下拉式组合框是HMI界面中的一个元素,它由一个...
首先,Layui自身提供的`layui-form`组件中并未直接包含支持多选的下拉选择框。不过,通过引入第三方插件或自定义扩展,我们可以轻松实现这一功能。这里提到的"xm-select"就是一个专门为Layui设计的下拉多选插件,...
在本文中,我们将深入探讨如何在AngularJS框架中实现下拉树控件,这是一种结合了树形结构和下拉选择功能的用户界面组件。AngularJS是Google开发的一个强大的前端JavaScript框架,它允许开发者构建可维护、可扩展的...
### ExtJs4 实现下拉树选择框 ComboTree #### 概述 在现代Web应用开发中,ExtJS 是一个非常强大的JavaScript库,用于构建复杂的客户端应用程序。它提供了丰富的组件库,使得开发者能够轻松地创建出功能丰富且交互性...
在IT界,尤其是在前端开发领域,下拉树形列表是一种常见的交互元素,它结合了下拉菜单和树状结构的特点,使得用户可以在一个简洁的界面中进行多级选择。本篇将深入探讨“下拉树形列表”的相关知识点,以及如何在实际...
4. **构建`bootstrap-treeview`**:在同一页面中,创建一个用于显示树形结构的容器,例如一个`<div>`元素。然后,使用`bootstrap-treeview`的API来填充树的数据,如`$('#treeview').treeview({data: treeData})`,...
当用户点击下拉按钮时,会显示一个包含层次结构数据的树形结构,用户可以通过展开节点、选择节点来选取所需数据。这种控件在处理有层次关系的数据时非常有用,例如组织结构、文件系统或者地区分类等。 实现这样的...
该插件是改良的layer的树形插件,在原始的layer插件中的树形结构是没有复选框的,改良后可用以拿来做权限系统的权限选择
例如,创建一个既可以下拉选择树形结构,又可以输入特定值的复合输入组件。 总的来说,下拉树控件是前端开发中的一个重要工具,它提升了用户在处理层级数据时的交互体验。理解其原理和实现方式,以及如何进行优化和...
本文将深入探讨如何创建一个自定义的C#下拉树形控件,这个控件结合了下拉列表和树视图的功能,为用户提供了一种交互式的选择方式。 首先,我们需要了解下拉列表和树形控件的基本概念。下拉列表通常用于提供一组可...
这个下拉树组件适用于多种场景,比如在权限管理中选择角色、在组织结构中选择员工、在商品分类中选择类型等。通过自定义`ztree`的配置项和事件回调,可以满足不同业务需求的定制化开发。 总结起来,`layui+ztree...
### jQuery UI 树状下拉选择框(Comboxtree)详解 #### 一、引言 随着 WEB2.0 及 AJAX 思想在互联网上的快速发展与传播,一系列优秀的 JavaScript 框架相继诞生,例如 Prototype、YUI、jQuery、MooTools、Bindows ...
初始化下拉列表是创建树形下拉菜单的第一步。这通常涉及设置HTML结构,然后通过layui的API加载数据。在layui中,可以使用`layui.tree.render()`方法来渲染树形结构,传入配置对象,其中包含数据源(一般为JSON数组...
组件名为`Ext.ux.comboboxtree`,它扩展了`Ext.form.field.Picker`,这表示我们是在原有的下拉选择框基础上添加自定义功能。`xtype`属性用于标识组件类型,方便在其他地方引用。 2. **配置项**(config): - `...
Ext下拉列表树是一种在ExtJS框架中实现的组件,它结合了下拉列表和树形结构的功能,为用户提供了一种交互式的、层次化的选择项。这种组件在数据管理、菜单选择、分类筛选等场景中非常常见,尤其适用于需要展现多级...
在下拉树形复选框中,zTree负责生成树形结构并处理节点的展开、折叠和选择状态。 要实现这样的组件,首先需要在HTML中设置基础结构,包括一个下拉按钮和一个隐藏的树形区域。然后,在CSS中,我们需要为下拉菜单添加...