解决 Ext3.x 中 ComboboxTree 展开树时panel被关闭的bug

解决办法, 把ComboboxTree.js代码换成下面的:

Ext.form.ComboBoxTree = Ext.extend(Ext.form.ComboBox, {
        store: new Ext.data.SimpleStore({ fields: [], data: [[]] }),
        editable: false,
        shadow: false,
        mode: 'local',
        triggerAction: 'all',
        selectedClass: '',
        onSelect: null,
        canCollapse: true,
        constructor: function(_cfg) {
            if (_cfg == null) {
                _cfg = {};
            }
            Ext.apply(this, _cfg);
            this.treerenderid = Ext.id();
            this.tpl = String.format('<tpl for="."><div style="height:200px"><div id="ext-combobox-tree{0}"></div></div></tpl>', this.treerenderid);
            Ext.form.ComboBoxTree.superclass.constructor.apply(this, arguments);
            if (this.tree) {
                var cmb = this;
                this.tree.on('click', function(node) {
                    cmb.canCollapse = true;
                    if (Ext.isFunction(cmb.onSelect)) {
                        cmb.onSelect(cmb, node);
                    } else {
                        cmb.setValue(node.text);
                        if (cmb.hiddenField) {
                            cmb.hiddenField.value = node.id;
                        }
                    }
                    cmb.collapse();
                });
                //以下事件,让combobox能正常关闭
                this.tree.on('expandnode', function() { cmb.canCollapse = true; });
                this.tree.on('beforeload', function() { cmb.canCollapse = false; });
                this.tree.on('beforeexpandnode', function() { cmb.canCollapse = false; });
                this.tree.on('beforecollapsenode', function() { cmb.canCollapse = false; });
            }
            this.on('expand', this.expandHandler, this);
            this.on('collapse', this.collapseHandler, this);
        },
        expandHandler: function expand() {
            this.canCollapse = true;
            if (this.tree) {
                this.tree.render('ext-combobox-tree' + this.treerenderid);
                this.canCollapse = true;          
                this.tree.getRootNode().expand();
                
            }
        },
        collapseHandler: function collapse() {
            if (!this.canCollapse) {
                this.expand();
            }
        }
    
    });
    Ext.reg('combotree', Ext.form.ComboBoxTree);


调用代码:
new Ext.form.ComboBoxTree({
           id: 'mytree',
           hiddenName:'dept_no',
           fieldLabel:'机构',
            tree: new Ext.tree.TreePanel({
                root: new Ext.tree.AsyncTreeNode({ text: '--选择--', id: '0' }),
                rootVisible: false,
                border: false,
                dataUrl: '/AreaList.aspx',
                listeners: {
                    beforeload: function(n) { if (n) { this.getLoader().baseParams.id = n.attributes.id; } }
                }
            })/*,
            onSelect: function(cmb, node) {
                alert(node.attributes.text);
            }*/
        })

posted @ 2011-07-13 14:12  hap  阅读(1242)  评论(0编辑  收藏  举报