`

ExtJS Combobox的多选扩写

阅读更多
在3.0里面有个BUG,就是选中后,焦点离开的时候,combo的RawValue就没了...

 

于是分析了下,定位到以下代码:

Js代码 
//Ext.form.ComboBox源码    
    // private    
    beforeBlur : function(){    
        var val = this.getRawValue();    
        if(this.forceSelection){    
            if(val.length > 0 && val != this.emptyText){    
               this.el.dom.value = Ext.isDefined(this.lastSelectionText) ? this.lastSelectionText : '';    
                this.applyEmptyText();    
            }else{    
                this.clearValue();    
            }    
        }else{    
           //关键问题所在    
            var rec = this.findRecord(this.displayField, val);    
            if(rec){    
                val = rec.get(this.valueField || this.displayField);    
            }    
            this.setValue(val);    
   
   
        }    
    },  
//Ext.form.ComboBox源码
    // private
    beforeBlur : function(){
        var val = this.getRawValue();
        if(this.forceSelection){
            if(val.length > 0 && val != this.emptyText){
               this.el.dom.value = Ext.isDefined(this.lastSelectionText) ? this.lastSelectionText : '';
                this.applyEmptyText();
            }else{
                this.clearValue();
            }
        }else{
           //关键问题所在
            var rec = this.findRecord(this.displayField, val);
            if(rec){
                val = rec.get(this.valueField || this.displayField);
            }
            this.setValue(val);


        }
    },
  
 

1.先来说说LovCombo的原理,

  1)其实它就是在store里面加一个field,用来标记是否选中.(配置项 checkField:'checked')

  2)value和rawValue都是通过逗号分隔的值(配置项 separator:',')

 

2.所以我们看上面的var rec=this.findRecor(this.displayField,val);肯定是得不到, rec为null,这时候value就被设置为val,也就是rawValue,但是如下代码,它的setValue判断的是value,所以自然为null

Js代码 
//Ext.ux.form.LovCombo.js    
setValue:function(v) {    
        if(v) {    
            v = '' + v;    
            if(this.valueField) {    
                this.store.clearFilter();    
                this.store.each(function(r) {    
                    var checked = !(!v.match(    
                         '(^|' + this.separator + ')' + RegExp.escape(r.get(this.valueField))    
                        +'(' + this.separator + '|$)'))    
                    ;    
   
                    r.set(this.checkField, checked);    
                }, this);    
                this.value = this.getCheckedValue();    
                this.setRawValue(this.getCheckedDisplay());    
                if(this.hiddenField) {    
                    this.hiddenField.value = this.value;    
                }    
            }    
            else {    
                this.value = v;    
                this.setRawValue(v);    
                if(this.hiddenField) {    
                    this.hiddenField.value = v;    
                }    
            }    
            if(this.el) {    
                this.el.removeClass(this.emptyClass);    
            }    
        }    
        else {    
            this.clearValue();    
        }    
    }  
//Ext.ux.form.LovCombo.js
setValue:function(v) {
		if(v) {
			v = '' + v;
			if(this.valueField) {
				this.store.clearFilter();
				this.store.each(function(r) {
					var checked = !(!v.match(
						 '(^|' + this.separator + ')' + RegExp.escape(r.get(this.valueField))
						+'(' + this.separator + '|$)'))
					;

					r.set(this.checkField, checked);
				}, this);
				this.value = this.getCheckedValue();
				this.setRawValue(this.getCheckedDisplay());
				if(this.hiddenField) {
					this.hiddenField.value = this.value;
				}
			}
			else {
				this.value = v;
				this.setRawValue(v);
				if(this.hiddenField) {
					this.hiddenField.value = v;
				}
			}
			if(this.el) {
				this.el.removeClass(this.emptyClass);
			}
		}
		else {
			this.clearValue();
		}
	}
  
3.修复的办法很简单,

1)重写beforeBlur

Js代码 
var combo = new Ext.ux.form.LovCombo({    
  width:600,    
  hideOnSelect:false,    
  maxHeight:200,    
  store:new Ext.data.SimpleStore({    
    id:0,    
    fields:['pid', 'imageName']    
  }),    
  triggerAction:'all',    
  valueField:'pid',    
  displayField:'imageName',    
  mode:'local',    
  <STRONG>beforeBlur:function(){}</STRONG>    
   
   
   
   
});  
    var combo = new Ext.ux.form.LovCombo({
      width:600,
      hideOnSelect:false,
      maxHeight:200,
      store:new Ext.data.SimpleStore({
        id:0,
        fields:['pid', 'imageName']
      }),
      triggerAction:'all',
      valueField:'pid',
      displayField:'imageName',
      mode:'local',
      beforeBlur:function(){}




    });
  
2)重写findRecord返回多个record,然后在顶上那段粗体部分的代码,遍历record,拼成value,再set进去.

--这个就自己写吧,也不复杂



实例:http://wwww.qilecn.com:8088/f/ext+combobox+%E5%A4%9A%E9%80%89/Ext2.0%E4%B8%8B%E6%8B%89%E5%A4%9A%E9%80%89%E8%8F%9C%E5%8D%95%28MultiComboBox%29+-+EXT+-+web+-+JavaEye%E8%AE%BA%E5%9D%9B----d3d3LmphdmFleWUuY29tL3RvcGljLzIxNTk3Mg==.html
分享到:
评论
1 楼 winerdaxian 2011-09-28  
很好的东西,谢了哦

相关推荐

    ExtJS日期多选组件源码

    通过研究和理解"ExtJS日期多选组件源码",开发者可以深入学习ExtJS组件设计、事件处理、数据绑定等核心概念,并能进一步定制适合自己项目需求的日期选择组件。这样的组件对于提高开发效率和用户体验具有积极的意义。

    Ext combobox 下拉多选框带搜索功能

    1. **配置多选**:通过设置`multiSelect: true`属性,可以让ComboBox支持多选模式。用户可以通过Ctrl或Shift键进行多选。 2. **实时搜索**:实现搜索功能需要监听ComboBox的`keyup`事件,并在此事件处理器中应用...

    Extjs6中Combobox实现下拉多选

    该资源主要展示了在Extjs6中Combobox控件实现下拉选择多个数据的功能

    combobox实现下拉框多选

    本方法和用checkbox, listbox等控件和事件拼凑出来的不同,本方法是一个集成的独立控件,基本实现了控件的顺滑度,下拉框可悬浮等效果,可以认为是comboBox的升级版,使用方便,仅需引用编译好的DLL,直接在toolBox...

    extjs4 ComboBox 点击下拉框 出现grid效果

    在EXTJS4中,ComboBox是一个常用的组件,它用于创建下拉选择框,通常用于输入框的辅助选择。这个组件提供了一种用户友好的方式来从一组预定义的选项中进行选择。然而,根据你的标题和描述,你似乎遇到了一个特别的...

    Extjs3 多选下拉框LovCombo

    3. **配置LovCombo**:创建一个Ext.form.ComboBox实例,指定store、displayField、valueField等配置项,并开启多选模式(multiSelect: true)。 4. **加载数据**:如果数据是异步加载的,需要在store的load方法中...

    Extjs3.4.0版本 多选下拉框效果支持多选/全选/全不选

    在ExtJS 3.4.0版本中,多选下拉框(Multiselect Combobox)是一种常见的用户界面组件,用于提供多个选项供用户选择。这个功能增强了标准的单选下拉框,允许用户同时选择多个条目,通常通过复选框实现。在描述中提到...

    Extjs下拉多选树

    在ExtJS中,"下拉多选树"(Combobox Tree)是一种结合了下拉框和树形结构的组件,它允许用户在下拉菜单中选择多个树节点,提供了一种高效且直观的用户交互方式。 1. **下拉树组件**:在ExtJS中,树形组件...

    Extjs4 多选下拉树

    在ExtJS4中,多选下拉树(Multi Select Tree)是一种用户界面组件,它结合了下拉菜单和树形结构,允许用户从层级结构中选择多个项目。这个组件在数据管理、分类选择等场景中非常实用。 在实现多选下拉树时,我们...

    ExtJs grid多选时获取选中的所有值

    ### ExtJs Grid 多选及获取选中值详解 #### 一、背景介绍 在Web应用开发中,ExtJs 是一款非常强大的JavaScript框架,它能够帮助开发者快速构建复杂的用户界面。其中,Grid Panel(简称 Grid)是ExtJs中最常用的一个...

    extjs中的多选列表

    在EXTJS这个强大的JavaScript框架中,虽然原生并未直接提供多选列表(Multi Select List)组件,但开发者可以通过自定义组件或者利用EXTJS现有的组件进行组合来实现这一功能。EXTJS是一个用于构建富客户端Web应用的...

    extjs多选 下拉框扩展

    总结起来,"extjs多选 下拉框扩展"是为了满足ExtJS应用中多选功能的需求,通过对原生ComboBox组件进行扩展和定制,实现了带有复选框的多选下拉框。这个扩展可能包括了新的配置项、模板修改、事件处理、数据模型、...

    找到的ExtJS实现多选下拉框3个代码

    多选下拉框在ExtJS中可以通过扩展ComboBox组件来实现。通常,这需要设置`multiSelect: true`属性,允许用户选择多个选项。同时,需要配置`typeAhead: false`以避免自动完成功能,因为这在多选模式下可能不适用。...

    ext多选下拉列表的全选功能实现

    MultiComboBox是ExtJS中的一个自定义组件,它扩展了基础的ComboBox类,增加了多选的功能。默认情况下,ComboBox只允许用户选择一个值,而MultiComboBox则允许用户选择多个值,这些值通常以复选框的形式展示。 要...

    Extjs4.X下comboboxTree下拉树型菜单,完美支持多选、单选,绝对好用

    同时,还需要配置`mode`为`EXTJS4`特有的`EXTJS4`模式,以启用树结构的多选功能。 3. **数据源与模型** 数据源通常通过`store`属性指定,可以是本地数据或者远程加载的数据。对于树形结构,需要使用`TreeStore`,...

    combobox Ext之扩展组件多选下拉框

    本篇将重点讲解ExtJS中的一个扩展组件——多选下拉框,即“combobox”。 在ExtJS中,ComboBox是一个基本的输入组件,它结合了文本输入框和下拉列表的功能。默认情况下,ComboBox只允许用户选择一个选项。但是,通过...

    extjs 自动补全 模拟combobox

    EXTJS并没有直接提供一个名为"自动补全"的组件,但它可以通过模拟Combobox组件来实现这一效果。Combobox是EXTJS中的一个下拉选择框,它可以显示一个下拉列表供用户选择,同时也可以配合自动补全功能。 首先,让我们...

    Extjs chekboxtree PagingTreeLoader 多选、分页

    本篇将深入探讨ExtJS中的"Chekboxtree"(复选框树)与"PagingTreeLoader"(分页树加载器)这两个特性,以及如何结合它们实现多选和分页功能。 "Chekboxtree"是ExtJS中的一种特殊树形组件,它允许用户通过复选框选择...

    extjs tree CHECKBOX 多选删除未实现(带SQL脚本)

    在网上下载别人的代码,改进加上CHECKBOX ,但是批量删除做不出来,希望高手完成并分享。

Global site tag (gtag.js) - Google Analytics