eXtjs4下拉树支持单选复选级联选择 [复制链接]

简介:

效果图.

  • 不带checked的json数据格式只支持单选


  • 带jchecked的json数据的单选


  • 带checked的json数据的多选,可支持级联操作,级联分为级联父节点,级联子节点,两者都级联


封装基类代码 :comboxtree.js
[html] view plain copy

  • Ext.define("Ext.ux.comboboxtree", {  

  •    extend: "Ext.form.field.Picker",  

  •    requires: ["Ext.tree.Panel"],  

  •    initComponent: function() {  

  •        var self = this;  

  •        Ext.apply(self, {  

  •            fieldLabel: self.fieldLabel,  

  •            labelWidth: self.labelWidth  

  •        });  

  •        self.callParent();  

  •    },  

  •    createPicker: function() {  

  •        var self = this;  

  •        var store = 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 = new Ext.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) {  

  •                var checkModel = self.checkModel;  

  •                if (checkModel == 'double') {  

  •                    var root = 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 {  


  •                    var cascade = 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);  

  •                                }  

  •                            }  


  •                        }  


  •                    } else if (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);  


  •                                });  

  •                            }  


  •                        }  


  •                    }  


  •                    var records = 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) {  

  •                var checkModel = self.checkModel;  


  •                if (checkModel == 'single') {  

  •                    if (record.get('leaf')) {  

  •                        self.setRawValue(record.get('id')); // 隐藏值  

  •                        self.setValue(record.get('text')); // 显示值  

  •                    } else {  

  •                        self.setRawValue(''); // 隐藏值  

  •                        self.setValue(''); // 显示值  

  •                    }  

  •                }  


  •            }  

  •        });  

  •        return self.picker;  

  •    },  

  •    alignPicker: function() {  

  •        var me = 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);  

  •            }  

  •        }  

  •    }  

  • });  



调用方法
[html] view plain copy

  • Ext.onReady(function() {  

  •    var com = 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格式的数据
一,不带复选框的数据
[html] view plaincopy

   [{  
       "text": "To Do",   
       "cls": "folder",  
       "expanded": true,  
       "children": [{  
           "text": "Go jogging",  
           "leaf": true  
       },{  
           "text": "Take a nap",  
           "leaf": true  

       },{  
           "text": "Climb Everest",  
           "leaf": true  

       }]  
   },{  
       "text": "Grocery List",  
       "cls": "folder",  
       "children": [{  
           "text": "Bananas",  
           "leaf": true  

       },{  
           "text": "Milk",  
           "leaf": true  

       },{  
           "text": "Cereal",  
           "leaf": true  

       },{  
           "text": "Energy foods",  
           "cls": "folder",  
           "children": [{  
               "text": "Coffee",  
               "leaf": true  

           },{  
               "text": "Red Bull",  
               "leaf": true  

           }]  
       }]  
   },{  
       "text": "Remodel Project",   
       "cls": "folder",  
       "children": [{  
           "text": "Finish the budget",  
           "leaf": true  

       },{  
           "text": "Call contractors",  
           "leaf": true  

       },{  
           "text": "Choose design",  
           "leaf": true  

       }]  
   }]  



二.带复选框的数据


[html] view plaincopy

   [{  
       "text": "To Do",   
       "cls": "folder",  
       "expanded": true,  
       "children": [{  
           "text": "Go jogging",  
           "leaf": true,  
           "checked": true  
       },{  
           "text": "Take a nap",  
           "leaf": true,  
           "checked": false  
       },{  
           "text": "Climb Everest",  
           "leaf": true,  
           "checked": false  
       }]  
   },{  
       "text": "Grocery List",  
       "cls": "folder",  
       "children": [{  
           "text": "Bananas",  
           "leaf": true,  
           "checked": false  
       },{  
           "text": "Milk",  
           "leaf": true,  
           "checked": false  
       },{  
           "text": "Cereal",  
           "leaf": true,  
           "checked": false  
       },{  
           "text": "Energy foods",  
           "cls": "folder",  
           "children": [{  
               "text": "Coffee",  
               "leaf": true,  
               "checked": false  
           },{  
               "text": "Red Bull",  
               "leaf": true,  
               "checked": false  
           }]  
       }]  
   },{  
       "text": "Remodel Project",   
       "cls": "folder",  
       "children": [{  
           "text": "Finish the budget",  
           "leaf": true,  
           "checked": false  
       },{  
           "text": "Call contractors",  
           "leaf": true,  
           "checked": false  
       },{  
           "text": "Choose design",  
           "leaf": true,  
           "checked": false  
       }]  
   }]  














本文转自yunlielai51CTO博客,原文链接:http://blog.51cto.com/4925054/1281319,如需转载请自行联系原作者

相关文章
社会网络分析法SNA
      社会网络分析法(Social Network Analysis)SNA       社会网络是社会行动者及他们之间关系的集合,行动者可以是个人、群体、组织乃至国家。关系是多方面的,有多种类型。由来自一个群体内行动者之间的关系构成的网络叫做1-模网络;两个群体的行动者之间的关系网叫做2-模网络;一个群体内的行动者参与多个社会团体构成的网络叫做隶属关系网。       由于关系
5555 0
|
5天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1131 2
|
4天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
640 11
|
14天前
|
人工智能 运维 安全
|
5天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
311 0
|
12天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
830 23
|
5天前
|
缓存 供应链 监控
VVIC seller_search 排行榜搜索接口深度分析及 Python 实现
VVIC搜款网seller_search接口提供服装批发市场的商品及商家排行榜数据,涵盖热销榜、销量排名、类目趋势等,支持多维度筛选与数据分析,助力选品决策、竞品分析与市场预测,为服装供应链提供有力数据支撑。

热门文章

最新文章