`
FX夜归人
  • 浏览: 4261 次
  • 来自: 北京
社区版块
存档分类
最新评论

Ext JS 之 CheckboxGroup 扩展

    博客分类:
  • Ext
阅读更多

          因需(产)求(品)要求,将原由“Ext.ux.form.LovCombo”实现的下拉多选(框)改为复选(框,Checkbox?CheckboxGroup)样(还得可全选),又因数据的加载获取、提交保存均是加“;”(/“,”)形式的字符串,后台程序改起来也可,但就是改动涉及的文件(类)项比较多,又怕影响到别的模块的数据,也就只能硬着头皮通过继承 CheckboxGroup(Ext.form)来实现咯。 

 

        刚接触 Ext,也没有动手做过,啥都不清楚,问同事,也说得不很清楚,只能看着源码(ext-3.4.1.1-gpl.zip)慢慢摸索着测试者来实现咯(测试运行在 Ext JS Library 3.4.0 版本)。整个实现过程挺痛苦,源码实在看不透,G 哥又躲躲闪闪,D 娘总非所需,中途好几次都想放弃(通过后台直接改),不过最终还是“生”出来啦,*^ο^*,特与大家分享、讨论,优化,共进步!

        选择“禁北上广”全选:

 

         设置“disabled”并提交:  

        重新加载设置“disabled”提交的数据

  

/**
 * CheckboxGroup(可含全选,可 disabled)
 * 提交/加载数据格式都为由“;”(this.valueSeparator)分割的字符串
 */

Ext.ns('Ext.ux.form');
Ext.ux.form.YtCheckboxGroup = Ext.extend(Ext.form.CheckboxGroup, {
    //  隐藏域名(不能与name相同,若相同,name 置为 Ext 自动生成值)
    hiddenName: "",
    //  格式 [{id: inputValue, text: boxLabel}]
	store: null,

    valueSeparator: ";",
    //  是否需要全选按钮
    isCheckedAllField: true,
    //  全选按钮域名(显示值)
    checkedAllFieldBoxLabel: "全选",
    //  全选按钮域值
    checkedAllFieldInputValue: -1,

    initComponent: function() {
        Ext.ux.form.YtCheckboxGroup.superclass.initComponent.call(this);
    },

    onRender: function(ct, position){
        if(this.name == this.hiddenName){
            this.name = "";
        }
        this.items = [];
        if(this.isCheckedAllField){
            var checkedAll = {
                    boxLabel: this.checkedAllFieldBoxLabel,
                    name: this.name,
                    inputValue: this.checkedAllFieldInputValue
                };
            this.items.push(checkedAll); 
        }
            
        this.store.each(function(record, index){
            var checkbox = {};
            checkbox = {name: this.name, boxLabel: record.data["text"], inputValue: record.data["id"], checked: false};
            this.items.push(checkbox);
        }, this);
        
        if(this.items && 0 < this.items.length){
            Ext.ux.form.YtCheckboxGroup.superclass.onRender.call(this, ct, position);
            //  添加隐藏域
            if(this.hiddenName && this.el){
                this.hiddenField = this.el.insertSibling({tag:'input', type:'hidden', name: this.hiddenName,
                        id: (this.hiddenId || Ext.id())}, 'before', true);
            }
        }
    },
    //  checke/change 事件(覆盖自 CheckboxGroup)
    fireChecked: function(checkbox, checked){
        if(this.isCheckedAllField
                && this.checkedAllFieldInputValue == checkbox.inputValue){
            this.checkedAllChecked(checkbox, checked);  //  全选项选择动作处理
        } else {
            this.checkboxChecked(checkbox, checked);    //  普通有效项选择动作处理
        }
    },

    //  全选项选择动作处理
    checkedAllChecked: function(checkbox, checked){
        if(checkbox.inputValue == this.checkedAllFieldInputValue){
            if(checked){
                this.checkedAll(checkbox);
            } else {
                this.deCheckedAll(checkbox);
            }
        }
    },

    //  普通有效项选择动作处理
    checkboxChecked: function(checkbox, checked){
        //  有效选择项(不含全选项)
        var validCheckedItems = [];
        
        this.eachItem(function(item){
            if(item.checked){
                if(this.checkedAllFieldInputValue != item.inputValue){
                    validCheckedItems.push(item);
                }
            }
        }, this);
        //  设置隐藏域值
        this.setHiddenValue(validCheckedItems);
        //  已选择 checkbox 数
        var validChedkedCount = (validCheckedItems && 0 < validCheckedItems.length)? validCheckedItems.length: -1;

        if(this.isCheckedAllField){
            if(checked){
                this.checkedAll(null, validChedkedCount);
            } else {
                this.deCheckedAll(null, validChedkedCount);
            }
        }
                
        if(!this.allowBlank){
            this.fireEvent('change', this, validCheckedItems);    //  验证不空事件
        }
    },

    //  设置隐藏域值(提交数据)
    setHiddenValue: function(checkedValues){
        var hiddenValue = "";
        if(0 < checkedValues.length){
            for(var i = 0; i < checkedValues.length; ++i){
                if(this.checkedAllFieldInputValue != checkedValues[i].inputValue){
                    if(0 != i){
                        hiddenValue += this.valueSeparator + checkedValues[i].inputValue;
                    } else {
                        hiddenValue += checkedValues[i].inputValue;
                    }
                }
            }
        }
        this.hiddenField.value = hiddenValue;
    },

    //  全选
    checkedAll: function(checkbox, validChedkedCount){
        if(!this.isCheckedAllField){
            return;
        }
        if(checkbox && this.checkedAllFieldInputValue == checkbox.inputValue){
            this.eachItem(function(item){
                if(this.checkedAllFieldInputValue != item.inputValue
                        && !item.checked){
                    item.setValue(true);
                }
            }, this);
        }
        if(this.items.length == (validChedkedCount + 1)){
            this.eachItem(function(item){
                if(this.checkedAllFieldInputValue == item.inputValue){
                    item.un('check', this.fireChecked, this);
                    item.un('check', this.checkeded, this);
                    item.setValue(true);
                    item.on('check', this.fireChecked, this);
                }
            }, this);
        }
    },

    //  取消全选
    deCheckedAll: function(checkbox, validChedkedCount){
        if(!this.isCheckedAllField){
            return;
        }
        if(checkbox && this.checkedAllFieldInputValue == checkbox.inputValue){
            this.eachItem(function(item){
                if(this.checkedAllFieldInputValue != item.inputValue
                        && item.checked){
                    item.setValue(false);
                }
            }, this);
        }
        if(this.items.length == (validChedkedCount + 2)){
            this.eachItem(function(item){
                if(this.checkedAllFieldInputValue == item.inputValue){
                    item.un('check', this.fireChecked, this);
                    item.setValue(false);
                    item.on('check', this.fireChecked, this);
                }
            }, this);
        }
    },

    getName: function(){
        return this.hiddenName? this.hiddenName: this.name;
    },

    setValue: function(value){
        /*this.eachItem(function(item){
            item.setValue(false);
        });*/
        this.reset();
        //  data[this.hiddenName]
        var values = value;
        if(null == values || "" == values){
            return;
        }
        var inputValues = values.split(this.valueSeparator);
        
        this.eachItem(function(item){
            if(this.checkedAllFieldInputValue != item.inputValue   //  去全选
                    && null != inputValues
                    && 0 < inputValues.length){
                for(var i = 0; i < inputValues.length; ++i){
                    if(inputValues[i] == item.inputValue){
                        item.setValue(true);
                        //  this.preItems.push(item);
                    }
                }
            }
        });
    },

    onDisable : function(){
        Ext.ux.form.YtCheckboxGroup.superclass.onDisable.call(this);
        this.hiddenField.disabled = true;   //  设置为 true,数据只显示,不提交
    },

    onEnable : function(){
        Ext.ux.form.YtCheckboxGroup.superclass.onEnable.call(this);
        this.hiddenField.disabled = false;
    }
});

Ext.reg('ytCheckboxGroup', Ext.ux.form.YtCheckboxGroup);

 

 

  • 大小: 2.8 KB
  • 大小: 1.5 KB
  • 大小: 1.7 KB
  • 大小: 1.7 KB
  • 大小: 1.8 KB
  • 大小: 1.8 KB
  • 大小: 1.5 KB
0
0
分享到:
评论
1 楼 flykk 2016-12-12  
能把 使用你编写的这个扩展的js代码,传一下吗?

相关推荐

    ExtJS实现动态读写Checkboxgroup

    在给定的文件名`ext-basex.js`中,我们可以推测它可能包含了ExtJS的基础组件或扩展,可能包括CheckboxGroup的实现。通常,这些文件会定义组件的类、样式和行为。为了进一步了解如何利用`ext-basex.js`,你需要查看该...

    Ext表单组件之checkbox

    如果需要一组互斥的复选框,可以使用`Ext.container.CheckboxGroup`,它允许用户从一组选项中选择一个。配置`columns`属性可以设置每行显示的复选框数量。 8. **响应式设计** 在移动设备上,复选框的布局可能需要...

    extjs 初始化checkboxgroup值的代码

    这段代码通过扩展Ext.form.CheckboxGroup类,向其中添加了两个方法来达到初始化和清空复选框组值的目的。 此外,在实际开发中,使用override对已有组件进行扩展时需要谨慎,确保不会影响到其他依赖该组件的代码,...

    ext js 动态下来框

    同时,你可以自定义复选框的样式和行为,比如使用`checkboxGroup`来分组复选框。 5. **绑定数据**: 通过`store`属性将之前创建的Store绑定到ComboBox上。 6. **监听事件**: 可以监听`select`事件来获取用户的选择...

    EXT3.2 多选下拉框

    多选下拉框在EXT JS中通常通过`Ext.form.CheckboxGroup`或`Ext.form.RadioGroup`类来实现,但在EXT3.2中,实现多选下拉框功能通常会使用`Ext.form.FieldSet`或`Ext.form.ComboBox`的自定义扩展。这类组件提供了复选...

    Ext2.0 form使用实例的例程

    2. **表单字段(Form Fields)**:包括文本字段(TextField)、密码字段(PasswordField)、选择框(Checkbox)、复选框组(CheckboxGroup)、单选框(RadioButton)、下拉列表(ComboBox)、日期选择器(DateField...

    ExtJSWeb应用程序开发指南(第2版)

    4.1.8 Ext.form.CheckboxGroup和Ext.form.RadioGroup 4.1.9 Ext.form.field.Trigger触发字段 4.1.10 Ext.form.field.Spinner微调字段 4.1.11 Ext.form.field.Picker拾取器字段 4.1.12 Ext.form.field.ComboBox...

    extjs4.1下拉复选框完整DEMO

    1. **创建下拉复选框组件**:使用`Ext.create`方法实例化`Ext.form.field.CheckboxGroup`,并配置相关属性,如字段名、列宽、布局等。 2. **配置store**:为下拉复选框关联一个`Ext.data.Store`,该store负责从...

    ExtJS3总结内容

    - `formcomponents`: `form`, `checkbox`, `checkboxgroup`, `combo`, `datefield`, `displayfield`, `field`, `fieldset`, `hidden`, `htmleditor`, `label`, `numberfield`, `radio`, `radiogroup`, `textarea`, `...

    extjs控件列表

    **Ext.form.CheckboxGroup** - **描述**: 编组的多选框,可以同时管理多个多选框。 - **用途**: 创建一组相关联的多选框,如兴趣爱好选择。 **Ext.form.DisplayField** - **描述**: 仅显示,不校验/不被提交的...

    无废话ExtJs 系统教程十九[动态复选框:RemoteCheckboxGroup]

    “RemoteCheckboxGroup”是ExtJS中的一个特定组件,它扩展了基础的CheckboxGroup类。在默认情况下,CheckboxGroup组件通常用于显示一组静态的复选框,而RemoteCheckboxGroup则增加了动态加载和更新复选框选项的功能...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -ExtAspNet扩展的多语言包在js\languages\extaspnet目录下,目前只有en,zh_CN,zh_TW三种实现 -你可以向其中添加自己的语言版本,并执行js\languages下的pack.bat打包,最后编译工程。 +2009-09-01 v2.0.9 ...

    ExtJS的xtype列表

    - `checkboxgroup`: 多选框组,用于管理一组关联的多选框。 - `displayfield`: 只读字段,用于显示信息,不能编辑。 - `radiogroup`: 单选按钮组,用于管理一组关联的单选按钮。 6. **图表组件**(只列出部分)...

    ExtAspNet_v2.3.2_dll

    -ExtAspNet扩展的多语言包在js\languages\extaspnet目录下,目前只有en,zh_CN,zh_TW三种实现 -你可以向其中添加自己的语言版本,并执行js\languages下的pack.bat打包,最后编译工程。 +2009-09-01 v2.0.9 ...

Global site tag (gtag.js) - Google Analytics