EXTjS4下拉树 支持单选多选级联选择 comboxtree

     初学EXTjS,代码参照了很多帖,忙活了一天,代码写的比较简单,容易看懂.

   本下拉树支持带复选框和不带复选框的JSON数据的,带复选框的下拉树也实现了单选功能,只需配置一下即可!

效果图.

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

  • 带jchecked的json数据的单选

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

封装基类代码

:comboxtree.js

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);
            }
        }
    }
});


调用方法

	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格式的数据

一,不带复选框的数据

[{
    "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
       
    }]
}]


 

二.带复选框的数据

 

[{
    "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
    }]
}]


 


如果有帮助记得支持一下哦,可能也有不完善的地方欢迎改进!微笑

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值