`
atian25
  • 浏览: 468782 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ExtJS 修复3.0里面的LovCombo(下拉多选框)的Bug

阅读更多

如果你不知道lovcombo是什么,看http://setting.iteye.com/blog/340900

 

 

 

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

 

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

//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

//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

    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进去.

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

 

 

  • 大小: 32.8 KB
分享到:
评论
5 楼 atian25 2010-11-04  
sssgon 写道
问下LZ,如果我想设置默认值该怎么设置呢?就是说一点击下拉的时候已经有默认选中的存在了


你setValue即可
4 楼 sssgon 2010-11-02  
问下LZ,如果我想设置默认值该怎么设置呢?就是说一点击下拉的时候已经有默认选中的存在了
3 楼 yangzelai 2010-06-03  
呃,错了,应该是:当选择一个下拉项后,lovCombo就把一切设置好了.所以在beforeBlur时,不必做任何值的检查.即写个空的就行了,当然如果不写一个function来覆盖它的话,默认就会继承这个function来执行了.
2 楼 yangzelai 2010-06-03  
把这个方法重写一个空的就行了.就是方法体内不写任何东西.
想写也可以,不过我认为没有必要,因为lovcombo的setValue方法里面又自动找了一道.
1 楼 fireinjava 2010-03-19  
天猪强啊按你的意思写的,顺便粘你这呵呵,改了beforeBlur
String.prototype.trim = function() {              
  return this.replace(/^\s+|\s+$/g, '');        
}

     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 texts = val.split(',');
        		var values='';
        		for(var i=0;i<texts.length;i++){
        				var rec = this.findRecord(this.displayField, texts[i].trim());
            		 if(rec){
            		 		values+=(values.length>0?',':'')+rec.data[this.valueField];
            		 	}
        			}
            this.setValue(values);
        }
    }

相关推荐

    Extjs3 多选下拉框LovCombo

    在ExtJS 3中,多选下拉框(LovCombo)是一种复合组件,它结合了下拉列表和“爱好者选择”(LOV,Lookup Value)的功能,允许用户在多个选项中进行复选选择。在Web应用中,这种组件常用于数据输入,特别是在数据库...

    ExtJS扩展:lovcombo(已解决Bug版)

    `lovcombo`的全称为“联动下拉组合框”,它的核心功能是实现两个或多个下拉框之间的数据联动,通常用于数据库中一对多或多对多关系的数据输入场景。例如,一个下拉框选择了国家,另一个下拉框则根据所选国家展示相应...

    extJS3.0完整包

    extJS3.0 extJS3.0 extJS3.0 extJS3.0 extJS3.0 extJS3.0 extJS3.0

    ExtJS3.0中文API

    绝对的ExtJS3.0中文API,本人在网上找了好久才找到的,在此奉献给大家!!解压后有30多兆!!

    ExtJs+3.0+最新最全中文API帮助文档

    ExtJs+3.0+最新最全中文API帮助文档+CHM版@156_25590.exe

    ExtJS3.0 源码分析与开发实例宝典

    ExtJS3.0 源码分析与开发实例宝典

    EXTJS3.0中文API (离线)

    8. **工具栏和菜单**:EXTJS提供了工具栏(Toolbar)和下拉菜单(Menu)组件,可以用于添加按钮、分隔符、下拉列表等元素,增强用户界面的功能性。 9. **拖放功能**:EXTJS支持拖放操作,允许用户将组件或数据在...

    extjs.3.0中文API

    2. 表单(Forms):强大的表单组件包括文本框、下拉框、复选框等,支持验证和远程提交。 3. 树形视图(Tree):用于展示层次结构的数据,支持展开、折叠、拖放操作。 4. 工具栏(Toolbars)和菜单(Menus):提供...

    extjs4.1下拉复选框完整DEMO

    在这个"extjs4.1下拉复选框完整DEMO"中,我们主要关注的是如何使用ExtJS实现一个具有动态加载功能的下拉复选框组件。这个DEMO包含以下几个关键组成部分: 1. **ext-all-debug.js**:这是ExtJS的核心库文件,包含了...

    extjs3.0开发包含示例api

    EXTJS 3.0是一款基于JavaScript的开源UI框架,它为Web应用提供了丰富的组件和功能。这个开发包包含了EXTJS 3.0的核心API、示例代码和源文件,是学习和开发EXTJS应用程序的重要资源。 一、EXTJS 3.0 API EXTJS 3.0的...

    ExtJS 下拉多选框lovcombo

    ### ExtJS 下拉多选框lovcombo:省份与城市级联选择实现 #### 背景介绍 在软件开发过程中,经常会遇到需要实现省份、城市等地理位置信息的级联选择功能的需求。对于前端开发者而言,如何高效地实现这一功能成为了...

    extjs-3.0-all-src

    ExtJS 3.0支持多语言,允许开发者轻松地将应用本地化,以满足全球用户的需求。 9. **API文档和社区资源**: 尽管ExtJS 3.0已经有些年头,但是仍有很多开发者在使用和维护它。网上有许多关于ExtJS 3.0的教程、示例...

    Extjs3.0 中文API帮助文档

    Extjs3.0中文API文档 够详细 够详细 够详细

    EXTJS3.0登陆DEMO

    EXTJS3.0登录DEMO是一个基于EXTJS框架的示例项目,展示了如何将EXTJS与STRUTS2、SPRING和IBATIS等流行Java技术整合,构建一个完整的Web应用程序。EXTJS是一个用于创建富客户端界面的JavaScript库,而STRUTS2、SPRING...

    extjs3.0框架

    4. **表单组件**:ExtJS提供了丰富的表单组件,如文本框、下拉框、复选框、单选按钮等,以及用于验证和提交表单的工具。这些组件支持自定义样式和事件处理,可以轻松创建复杂的表单界面。 5. **数据网格**:ExtJS的...

    Extjs3.0 常用组件介绍及怎么安装开发利器Spket

    3. **Form(表单)**: ExtJS提供了多种表单组件,如文本框、下拉框、复选框、按钮等,以及表单验证功能,方便用户输入和提交数据。 4. **Tree(树形)**: Tree组件用于显示层次结构的数据,如目录结构或组织架构,...

    extjs3.0 组件

    除了以上组件,EXTJS 3.0 还包含了许多其他组件,如工具栏(Toolbar)、按钮(Button)、提示框(Tip)等,这些组件共同构建了EXTJS 强大的组件生态系统。开发者可以根据需要组合使用这些组件,构建出功能完备、用户...

    EXTJS3.0多文件上传组件

    在"EXTJS3.0多文件上传组件"中,我们主要关注的是如何利用EXTJS3.0的功能来实现一个高效的、用户友好的多文件上传功能。 首先,`swfupload.js`是Flash-Based的文件上传库,它允许用户在不离开当前页面的情况下进行...

    extjs3.0部分插件代码

    在"extjs3.0部分插件代码"这个资料中,我们可以期待学习到关于ExtJS 3.0版本的一些关键插件的实现细节。 首先,让我们关注一下"spinner"这个文件名。在ExtJS中,Spinner是一个常见的组件,它通常用作数值输入框,...

Global site tag (gtag.js) - Google Analytics