本下拉树支持带复选框和不带复选框的JSON数据的,带复选框的下拉树也实现了单选功能,只需配置一下即可!
效果图.
封装基类代码
:ComboboxTree.js
- Ext.define("Ext.ux.ComboboxTree",{
- extend:"Ext.form.field.Picker",
- requires:["Ext.tree.Panel"],
- initComponent:function(){
- varself=this;
- Ext.apply(self,{
- fieldLabel:self.fieldLabel,
- labelWidth:self.labelWidth
- });
- self.callParent();
- },
- createPicker:function(){
- varself=this;
- varstore=Ext.create('Ext.data.TreeStore',{
- proxy:{
- type:'ajax',
- url:self.storeUrl
- },
- sorters:[{
- property:'leaf',
- direction:'ASC'
- },
- {
- property:'text',
- direction:'ASC'
- }],
- root:{
- id:self.rootId,
- text:self.rootText
- },
- nodeParameter:self.treeNodeParameter
- });
- self.picker=newExt.tree.Panel({
- height:300,
- autoScroll:true,
- floating:true,
- focusOnToFront:false,
- shadow:true,
- ownerCt:this.ownerCt,
- useArrows:true,
- store:store,
- rootVisible:false
- });
- self.picker.on({
- checkchange:function(record,checked){
- varcheckModel=self.checkModel;
- if(checkModel=='double'){
- varroot=self.picker.getRootNode();
- root.cascadeBy(function(node){
- if(node.get('text')!=record.get('text')){
- node.set('checked',false);
- }
- });
- if(record.get('leaf')&&checked){
- self.setRawValue(record.get('id'));//隐藏值
- self.setValue(record.get('text'));//显示值
- }else{
- record.set('checked',false);
- self.setRawValue('');//隐藏值
- self.setValue('');//显示值
- }
- }else{
- varcascade=self.cascade;
- if(checked==true){
- if(cascade=='both'||cascade=='child'||cascade=='parent'){
- if(cascade=='child'||cascade=='both'){
- if(!record.get("leaf")&&checked)record.cascadeBy(function(record){
- record.set('checked',true);
- });
- }
- if(cascade=='parent'||cascade=='both'){
- pNode=record.parentNode;
- for(;pNode!=null;pNode=pNode.parentNode){
- pNode.set("checked",true);
- }
- }
- }
- }elseif(checked==false){
- if(cascade=='both'||cascade=='child'||cascade=='parent'){
- if(cascade=='child'||cascade=='both'){
- if(!record.get("leaf")&&!checked)record.cascadeBy(function(record){
- record.set('checked',false);
- });
- }
- }
- }
- varrecords=self.picker.getView().getChecked(),
- names=[],
- values=[];
- Ext.Array.each(records,
- function(rec){
- names.push(rec.get('text'));
- values.push(rec.get('id'));
- });
- self.setRawValue(values.join(';'));//隐藏值
- self.setValue(names.join(';'));//显示值
- }
- },
- itemclick:function(tree,record,item,index,e,options){
- varcheckModel=self.checkModel;
- if(checkModel=='single'){
- if(record.get('leaf')){
- self.setRawValue(record.get('id'));//隐藏值
- self.setValue(record.get('text'));//显示值
- }else{
- self.setRawValue('');//隐藏值
- self.setValue('');//显示值
- }
- }
- }
- });
- returnself.picker;
- },
- alignPicker:function(){
- varme=this,
- picker,isAbove,aboveSfx='-above';
- if(this.isExpanded){
- picker=me.getPicker();
- if(me.matchFieldWidth){
- picker.setWidth(me.bodyEl.getWidth());
- }
- if(picker.isFloating()){
- picker.alignTo(me.inputEl,"",me.pickerOffset);//""->tl
- isAbove=picker.el.getY()<me.inputEl.getY();
- me.bodyEl[isAbove?'addCls':'removeCls'](me.openCls+aboveSfx);
- picker.el[isAbove?'addCls':'removeCls'](picker.baseCls+aboveSfx);
- }
- }
- }
- });
调用方法
- Ext.onReady(function(){
- varcom=Ext.create("Ext.ux.ComboboxTree",{
- id:'name',
- name:'name',
- hiddenName:'hiddenName',
- storeUrl:'data/tree2.json',
- cascade:'child',//级联方式:1.child子级联;2.parent,父级联,3,both全部级联
- checkModel:'single',//当json数据为不带checked的数据时只配置为single,带checked配置为double为单选,不配置为多选
- width:270,
- fieldLabel:'单位树',
- labelWidth:60,
- rootId:'1',
- rootText:'DRP',
- treeNodeParameter:'',
- renderTo:Ext.getBody()
- });
- });
两种json格式的数据
一,不带复选框的数据
- [{
- "text":"ToDo",
- "cls":"folder",
- "expanded":true,
- "children":[{
- "text":"Gojogging",
- "leaf":true
- },{
- "text":"Takeanap",
- "leaf":true
- },{
- "text":"ClimbEverest",
- "leaf":true
- }]
- },{
- "text":"GroceryList",
- "cls":"folder",
- "children":[{
- "text":"Bananas",
- "leaf":true
- },{
- "text":"Milk",
- "leaf":true
- },{
- "text":"Cereal",
- "leaf":true
- },{
- "text":"Energyfoods",
- "cls":"folder",
- "children":[{
- "text":"Coffee",
- "leaf":true
- },{
- "text":"RedBull",
- "leaf":true
- }]
- }]
- },{
- "text":"RemodelProject",
- "cls":"folder",
- "children":[{
- "text":"Finishthebudget",
- "leaf":true
- },{
- "text":"Callcontractors",
- "leaf":true
- },{
- "text":"Choosedesign",
- "leaf":true
- }]
- }]
二.带复选框的数据
- [{
- "text":"ToDo",
- "cls":"folder",
- "expanded":true,
- "children":[{
- "text":"Gojogging",
- "leaf":true,
- "checked":true
- },{
- "text":"Takeanap",
- "leaf":true,
- "checked":false
- },{
- "text":"ClimbEverest",
- "leaf":true,
- "checked":false
- }]
- },{
- "text":"GroceryList",
- "cls":"folder",
- "children":[{
- "text":"Bananas",
- "leaf":true,
- "checked":false
- },{
- "text":"Milk",
- "leaf":true,
- "checked":false
- },{
- "text":"Cereal",
- "leaf":true,
- "checked":false
- },{
- "text":"Energyfoods",
- "cls":"folder",
- "children":[{
- "text":"Coffee",
- "leaf":true,
- "checked":false
- },{
- "text":"RedBull",
- "leaf":true,
- "checked":false
- }]
- }]
- },{
- "text":"RemodelProject",
- "cls":"folder",
- "children":[{
- "text":"Finishthebudget",
- "leaf":true,
- "checked":false
- },{
- "text":"Callcontractors",
- "leaf":true,
- "checked":false
- },{
- "text":"Choosedesign",
- "leaf":true,
- "checked":false
- }]
- }]