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

ExtJS combox研究

    博客分类:
  • Ext
阅读更多
    玩EXT框架的人肯定会用到combox组件。那么我们来看看下面两种情况:
    第一种:数据在本地,也就是说mode:'local'
   
 new Ext.form.ComboBox({
									fieldLabel : '对象名称',
									hiddenName : 'permissionobjectName',
									store : new Ext.data.SimpleStore({
										fields : ['objectValue', 'permissionobjectName'],
										data : [['增加', '增加'], ['修改', '修改'], ['删除', '删除']]
									}),
									valueField : 'objectValue',
									displayField : 'permissionobjectName',
									typeAhead : true,
									mode : 'local',
									triggerAction : 'all',
									allowBlank:false,
									blankText : '请对象名称',
									emptyText : '选择对象名称',
									selectOnFocus : true,
									width : 190
								})

    

    像这种情况修改时,直接到对应的store中读取数据.
    第二种情况远程加载数据,也就是mode:'remote',默认就是远程加载,看一段代码:
{
									xtype:'combo',
									fieldLabel : '模块名称',
									store : moduleStore,
									displayField : 'moduleName',
									valueField : 'moduleId',
									hiddenName : 'moduleId',
									autocomplete:'on',
									queryDelay:50,
									minChars :1,
									//pageSize:10,
									triggerAction :'all',
									forceSelection : true,
									selectOnFocus : true,
									typeAhead : true
								}

    像这种情况,修改时就会碰到一个头痛的问题,displayField的值是hiddenName的值。也是说只显示value,不显示text。原因是什么呢?先分析一下BaseForm.js源代码,我们只看其中用到的几个方法:
setValues : function(values){
        if(Ext.isArray(values)){ // array of objects
            for(var i = 0, len = values.length; i < len; i++){
                var v = values[i];
                var f = this.findField(v.id);
                if(f){
                    f.setValue(v.value);
                    if(this.trackResetOnLoad){
                        f.originalValue = f.getValue();
                    }
                }
            }
        }else{ // object hash
            var field, id;
            for(id in values){
                if(typeof values[id] != 'function' && (field = this.findField(id))){
                    field.setValue(values[id]);
                    if(this.trackResetOnLoad){
                        field.originalValue = field.getValue();
                    }
                }
            }
        }
        return this;
    },
 findField : function(id){
        var field = this.items.get(id);
        if(!field){
            this.items.each(function(f){
                [color=red]if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id))[/color]{
                    field = f;
                    return false;
                }
            });
        }
        return field || null;
    }

看到红色那句代码没有啊,原理是遍历得到的这个条记录,也就是store中一个record,当遍历到与displayField对应的字段(因为displayField的name在store的dataIndex中肯定找的到)时,不满足条件就返回一个null,所以肯定得不到要显示的text,因而就显示hiddenName(因为在没有批定name时,hiddenName相当name)
那接下来就覆盖setValue与findField这两个方法
/**
     * Find a Ext.form.Field in this form by id, dataIndex, name or hiddenName.
     * @param {String} id The value to search for
     * @return Field
     */
    findField : function(id,value){
        var field = this.items.get(id);
        if(!field){
           this.items.each(function(f){  
				if(f.isXType('combo')){  
						if(f.displayField==id){
							field = f;
							return false;  
						}
				}  
	                                 
				if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){  
					field = f;  
					return false;  
				}  
			});  
        }
        return field || null;
    },
    loadData:function(id,value){
    	var field = this.items.get(id);
        if(!field){
           this.items.each(function(f){  
				if(f.isXType('combo')){
						if(f.mode=='remote'&&f.isFormField &&f.displayField==id){
							f.store.load({
								params : {
									'query':value
								}
							});
						}
				}  
			});  
        }
    },
    setValues : function(values){
        if(Ext.isArray(values)){ // array of objects
            for(var i = 0, len = values.length; i < len; i++){
                var v = values[i];
                var f = this.findField(v.id);
                if(f){
                    f.setValue(v.value);
                    if(this.trackResetOnLoad){
                        f.originalValue = f.getValue();
                    }
                }
            }
        }else{ // object hash
            var field, id;
            for(id in values){
            	if(typeof values[id] != 'function'){
            		this.loadData(id,values[id]);
                }
            }
            for(id in values){
                if(typeof values[id] != 'function' &&(field = this.findField(id,values[id]))){
                    field.setValue(values[id]);
                    if(this.trackResetOnLoad){
                        field.originalValue = field.getValue();
                    }
                }
            }
        }
        return this;
    }


看得仔细的肯定会发现多了一个方法loadData,为什么呢?去掉这个方法,确实修改时displayField可以得到了,但是有一个严重的问题,hiddenName的值与displayField的值一样了,这样提交到后台肯定会报异常。为什么?原因是combox中的store没有加载,所以就出就现在这种问题,加上loadData这个方法就可以解决啦。
0
0
分享到:
评论

相关推荐

    Extjs之旅-combox之远程加载数据

    本篇我们将深入探讨“Extjs之旅”中的一个关键组件——Combox(组合框),特别是其远程加载数据的特性。 Combox在ExtJS中是一个非常灵活的控件,它可以看作是下拉列表和文本输入框的结合体,用户可以输入文本搜索,...

    Extjs6中Combobox实现下拉多选

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

    Extjs4下拉菜单ComboBox中用Grid显示通用控件

    在EXTJS4中,`ComboBox` 是一个非常常用的组件,它提供了一个下拉选择框的功能。在某些场景下,我们可能需要在下拉菜单中展示更丰富的信息,比如表格数据,这时就可以使用 `GridComboBox`。`GridComboBox` 结合了 `...

    Extjs4 Combox tree

    ExtJS4中的ComboxTree是一种将下拉列表与树形结构结合的组件,它扩展了标准的ComboBox,提供了更丰富的用户交互体验。这种组件在数据展示和选择时特别有用,尤其是在处理具有层级关系的数据时,比如部门结构、地区...

    Extjs 下拉菜单实现拼音输入进行检索

    Extjs 下拉菜单实现拼音输入进行检索

    Extjs中ComboBox加载并赋初值的实现方法

    在Extjs框架中,ComboBox组件是经常使用的组件之一,它允许用户在一个下拉列表中进行选择。当需要在ComboBox加载数据之后为其赋初值,且这个赋值操作需要在数据加载完成后才能进行,以确保用户体验的正确性时,需要...

    ExtJS4给Combobox设置列表中的默认值示例

    在本文中,我们将深入探讨如何使用ExtJS4框架为Combobox控件设置列表中的默认值。ExtJS4是一个广泛使用的JavaScript框架,专门用于创建富互联网应用(RIA)。它提供了丰富的组件和接口,以帮助开发者构建具有高度...

    ExtJS PropertyGrid中使用Combobox选择值问题

    在ExtJS中,PropertyGrid是一种用于展示对象属性的控件,它可以方便地编辑和查看对象的各个属性。在PropertyGrid中遇到的一个常见问题是当使用Combobox(下拉列表框)作为编辑器时,用户选择的值(displayField)与...

    extJs 文本框后面加上说明文字+下拉列表选中值后触发事件

    在EXTJS中,创建一个具有特定功能的表单通常涉及到多个组件的组合使用,如文本框、下拉列表以及事件监听。在这个例子中,我们看到一个EXTJS的表单面板`Ext.FormPanel`被用来展示一个包含文本框、下拉列表和标签的...

    combox下拉树combox下拉树

    这种控件的实现主要依赖于前端框架和库,如JavaScript的jQuery、Vue.js、React.js,以及后端技术如Java的Swing、JQuery UI、ExtJS等。 在JavaScript中,例如使用jQuery UI,可以利用`selectmenu`插件来实现类似的...

    CooliteToolkit(ExtJS可视化控件)Demo

    从页面布局和使用的控件TextBox,Combox,Button,ToolBar,StateBar,Panel,TabPanel,ExplorerBar,MenuBar,PictureBox都用统一的样式非常方便的配置,基本不需要额外美工处理,同时支持ajax无刷新效果。

    extcombox搜索功能

    ExtJS 是一个流行的JavaScript库,用于构建富客户端的Web应用程序。在ExtJS中,`Ext.form.field.ComboBox`(简称ComboBox)是一种常用的控件,它提供了一个下拉列表,用户可以在其中选择一个或多个项目。这个控件在...

    Extjs 4.1 下拉框 Tree 的实现(mvc)

    本文将深入探讨如何在ExtJS 4.1环境中利用MVC架构实现一个功能丰富的下拉框(Tree ComboBox),并结合具体代码示例进行详细解析。 ### ExtJS 4.1 下拉框Tree实现(MVC) #### 1. MVC架构简介 MVC,即Model-View-...

    EXT中COMBOX联动

    EXTJS是一种基于JavaScript的开源富客户端框架,用于构建桌面级的Web应用程序。它提供了一套完整的组件库,其中包括COMBOBOX(下拉框)组件,该组件在许多数据选择场景中非常常见。"EXT中COMBOBOX联动"指的是在EXTJS...

    Ext 将grid渲染到combox

    ### Ext JS 中将 Grid 渲染到 ComboBox 的方法 在 Ext JS 框架中,有时需要将 Grid 控件的数据渲染到 ComboBox 中,这在实际应用中是非常实用且灵活的功能。下面将详细介绍如何利用 Ext JS 的 XTemplate 特性来实现...

    CooliteToolkit(ExtJS可视化控件)Demo v0.8.0.rar

    从页面布局和使用的控件TextBox,Combox,Button,ToolBar,StateBar,Panel,TabPanel,ExplorerBar,MenuBar,PictureBox都用统一的样式非常方便的配置,基本不需要额外美工处理,同时支持ajax无刷新效果。...

    ExtJS 设置级联菜单的默认值

    在前端开发中,ExtJS是一个流行的JavaScript框架,用于构建富互联网应用程序。其中,级联菜单是一种常见的用户界面组件,允许用户从一个下拉列表中选择一个选项来更新另一个下拉列表的选项。在这个过程中,设置...

    combobox实现下拉框多选

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

    log4Net详解(共2讲)

    3、有志于从事富客户端技术ExtJs的学习与研究的学生及专业Web开发人员 模块介绍 1、ExtJs基础篇-ExtJs快速入门 1.1、ExtJs基础篇(1):ExtJs概述与环境配置及架构剖析 1.2、ExtJs基础篇(2):ExtJs OOP基础 1.3、...

Global site tag (gtag.js) - Google Analytics