因需(产)求(品)要求,将原由“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);
相关推荐
在给定的文件名`ext-basex.js`中,我们可以推测它可能包含了ExtJS的基础组件或扩展,可能包括CheckboxGroup的实现。通常,这些文件会定义组件的类、样式和行为。为了进一步了解如何利用`ext-basex.js`,你需要查看该...
如果需要一组互斥的复选框,可以使用`Ext.container.CheckboxGroup`,它允许用户从一组选项中选择一个。配置`columns`属性可以设置每行显示的复选框数量。 8. **响应式设计** 在移动设备上,复选框的布局可能需要...
这段代码通过扩展Ext.form.CheckboxGroup类,向其中添加了两个方法来达到初始化和清空复选框组值的目的。 此外,在实际开发中,使用override对已有组件进行扩展时需要谨慎,确保不会影响到其他依赖该组件的代码,...
同时,你可以自定义复选框的样式和行为,比如使用`checkboxGroup`来分组复选框。 5. **绑定数据**: 通过`store`属性将之前创建的Store绑定到ComboBox上。 6. **监听事件**: 可以监听`select`事件来获取用户的选择...
多选下拉框在EXT JS中通常通过`Ext.form.CheckboxGroup`或`Ext.form.RadioGroup`类来实现,但在EXT3.2中,实现多选下拉框功能通常会使用`Ext.form.FieldSet`或`Ext.form.ComboBox`的自定义扩展。这类组件提供了复选...
2. **表单字段(Form Fields)**:包括文本字段(TextField)、密码字段(PasswordField)、选择框(Checkbox)、复选框组(CheckboxGroup)、单选框(RadioButton)、下拉列表(ComboBox)、日期选择器(DateField...
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...
1. **创建下拉复选框组件**:使用`Ext.create`方法实例化`Ext.form.field.CheckboxGroup`,并配置相关属性,如字段名、列宽、布局等。 2. **配置store**:为下拉复选框关联一个`Ext.data.Store`,该store负责从...
- `formcomponents`: `form`, `checkbox`, `checkboxgroup`, `combo`, `datefield`, `displayfield`, `field`, `fieldset`, `hidden`, `htmleditor`, `label`, `numberfield`, `radio`, `radiogroup`, `textarea`, `...
**Ext.form.CheckboxGroup** - **描述**: 编组的多选框,可以同时管理多个多选框。 - **用途**: 创建一组相关联的多选框,如兴趣爱好选择。 **Ext.form.DisplayField** - **描述**: 仅显示,不校验/不被提交的...
“RemoteCheckboxGroup”是ExtJS中的一个特定组件,它扩展了基础的CheckboxGroup类。在默认情况下,CheckboxGroup组件通常用于显示一组静态的复选框,而RemoteCheckboxGroup则增加了动态加载和更新复选框选项的功能...
-ExtAspNet扩展的多语言包在js\languages\extaspnet目录下,目前只有en,zh_CN,zh_TW三种实现 -你可以向其中添加自己的语言版本,并执行js\languages下的pack.bat打包,最后编译工程。 +2009-09-01 v2.0.9 ...
- `checkboxgroup`: 多选框组,用于管理一组关联的多选框。 - `displayfield`: 只读字段,用于显示信息,不能编辑。 - `radiogroup`: 单选按钮组,用于管理一组关联的单选按钮。 6. **图表组件**(只列出部分)...
-ExtAspNet扩展的多语言包在js\languages\extaspnet目录下,目前只有en,zh_CN,zh_TW三种实现 -你可以向其中添加自己的语言版本,并执行js\languages下的pack.bat打包,最后编译工程。 +2009-09-01 v2.0.9 ...