`

ExtJs中FormPanel中遇到radiogroup、checkboxgroup時賦值問題!!!

阅读更多

在Extjs中常常会遇到各种各样的问题,诸如在FormPanel中出现radiogroup、checkboxgroup与数据库交互时的提交时,你需要的是字符串格式或者指定的格式,但提交时显示的(如:json格式)仍然是一个数组形式,不如我们重写(override)它的getValue()来转换成我们的格式如何?那么我们这样实现:

   getValue:function(){
          var out="";//我要装换成的格式是字符串形式
          this.items.each(function(item){
                     out+=item.name+"," ;//(或者item.id、item.boxLabel、item.inputValue等)
          }); 
          console.log(out);
          return out;
   }
 

因为各人遇到的情况不同,而解决的办法就更加不同,重写了checkboxgroup的getValue我发现仍然解决不了我的问题,因为我发现即使我重写了getValue()方法,它依然返回的是个数组,但又确定调用了我重写的getValue()方法,郁闷了半天,都不知道问题出在哪里?

        重新整理思路:我左边是个扩展了GridPanel的Grid,右边是扩展了FormPanel的Form,要求在Grid中选中一行时,右边的FormPanel就可以加载该数据,在这个过程中,加载数据到checkboxgroup中需要重写(override)才能加载:

Ext.override(Ext.form.CheckboxGroup,{
    setValueForItem : function(val){
    	
        val = String(val).split(',');

        this.items.each(function(item){
                item.setValue(false);   //初始化,現將所有的checkbox設為未選定。
        });
        //this.items.each()<====>this.eachItem();
        
        this.items.each(function(item){
            if(val.indexOf(item.inputValue)> -1){   //從數據庫中提取數據,與頁面上checkbox的inputValue對比來判斷是否選中。
                item.setValue(true);    //可理解為以下:
            }         
            /*
              等價于:
             for(var i=0;i<val.length;i++){
                 if(var[i]==item.inputValue){
                     item.setValue(true);
                 }
             }    
            */
        });   
    }
});

 不然的话,只会加载文本框的值; 同时右边的Form中的值更改后要求先保存到左边的Grid的store中,再保存到数据库中去,因为我数据库中对应于checkboxgroup的字段是字符串型,所以在Form提交时就要先转化为字符串!这就是我要实现的要求,现在是提交时总是转化不了!

           要Form提交,则肯定要把更改的数据重新设值到Form中,于是就有

this.getForm().updateRecord(record)

    getForm() 是得到的 Ext.form.BasicForm,它的updateRecord为:

updateRecord( Record record ) : BasicForm

    经过仔细阅读,发现updateRecord()内部中会对Form中的信息重新设值,这也是我希望的,但发现其对radiogroup、checkboxgroup的实现与我要求的不同,于是,最终的解决办法就是把其中的方法重写即可:

Ext.override(Ext.form.BasicForm,{	
   findField : function(id){   //此部份是爲了讓BasicForm能夠找到不只是FormField,讓他能夠試用于radiogroup、checkboxgroup的情況.
        var field = this.items.get(id); 
        
        if(!field){
            this.items.each(function(f){
                if((f.isXType('radiogroup')||f.isXType('checkboxgroup'))&& (f.dataIndex == id || f.id == id || f.getName() == id)){
                    field = f;
                    return false;
                }
                                
                if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){
                    field = f;
                    return false;
                }
            });
        }
        return field || null;
    }
    ,updateRecord : function(record){ //既然已經能夠試用于radiogroup、checkboxgroup了!那麼在Form中當然就要對其設置獲取的值啦!
        record.beginEdit();
        var fs = record.fields;
        fs.each(function(f){
            var field = this.findField(f.name);
            if(field){
                var value = field.getValue();
                
                if ( value.getGroupValue ) {
                    value = value.getGroupValue();
                   
                } else if ( field.eachItem ) {
         			var re = "";  
	        		field.eachItem(function(item){
	             		if(item.getValue() == true){  
	                 		re += item.inputValue + ",";  
	             		}  
	        		});
					if (re.length > 0){
						value = re.substr(0,re.length - 1);  
					}else{
						value = re	
					}
                }
                record.set(f.name, value);
            }
        }, this);
        record.endEdit();
        return this;
    }
});

 其实就是在其中实现当遇到radiogroup、checkboxgroup的实现方式,这里才是最终的实现。问题终于解决,在此留下足迹以待以后遇到类似的问题能够解决问题!

 

整个实现代码如下(总结):

Ext.override(Ext.form.CheckboxGroup,{
    
    setValueForItem : function(val){
    	
        val = String(val).split(',');

        this.items.each(function(item){
                item.setValue(false);   //初始化,現將所有的checkbox設為未選定。
        });
        //this.items.each()<====>this.eachItem();
        
        this.items.each(function(item){
            if(val.indexOf(item.inputValue)> -1){   //從數據庫中提取數據,與頁面上checkbox的inputValue對比來判斷是否選中。
                item.setValue(true);    //可理解為以下:
            }         
            /*
              等價于:
             for(var i=0;i<val.length;i++){
                 if(var[i]==item.inputValue){
                     item.setValue(true);
                 }
             }    
            */
        });   
    }
});



Ext.override(Ext.form.BasicForm,{
	
   findField : function(id){   //此部份是爲了讓BasicForm能夠找到不只是FormField,讓他能夠試用于radiogroup、checkboxgroup的情況.
        var field = this.items.get(id);     
        if(!field){
            this.items.each(function(f){
                if((f.isXType('radiogroup')||f.isXType('checkboxgroup'))&& (f.dataIndex == id || f.id == id || f.getName() == id)){
                    field = f;
                    return false;
                }                      
                if(f.isFormField && (f.dataIndex == id || f.id == id || f.getName() == id)){
                    field = f;
                    return false;
                }
            });
        }
        return field || null;
    }
    ,updateRecord : function(record){ //既然已經能夠試用于radiogroup、checkboxgroup了!那麼在Form中當然就要對其設置獲取的值啦!
        record.beginEdit();
        var fs = record.fields;
        fs.each(function(f){
            var field = this.findField(f.name);
            if(field){
                var value = field.getValue();
                
                if ( value.getGroupValue ) {
                    value = value.getGroupValue();
                   
                } else if ( field.eachItem ) {
         			var re = "";  
	        		field.eachItem(function(item){
	             		if(item.getValue() == true){  
	                 		re += item.inputValue + ",";  
	             		}  
	        		});
					if (re.length > 0){
						value = re.substr(0,re.length - 1);  
					}else{
						value = re	
					}
                }
                record.set(f.name, value);
            }
        }, this);
        record.endEdit();
        return this;
    }
});
 

 

 

 

分享到:
评论

相关推荐

    EXTJS checkbox赋值

    在描述中提到的“最难解决的问题”——在修改时为`checkboxgroup`赋值,这是因为EXTJS默认的`setValue`方法可能不会按照期望的方式更新所有复选框的状态。为了解决这个问题,开发者通常需要自定义方法来处理。如示例...

    ExtJS实现动态读写Checkboxgroup

    在ExtJS中,CheckboxGroup是一个控件,允许用户以多选框的形式展示一组可选的选项。动态读写Checkboxgroup涉及了对用户交互的响应以及数据的实时更新,这对于创建交互性强、用户友好的界面至关重要。下面将详细讲解...

    extjs中的formPanel以及表单的应用

    FormPanel 是 ExtJS 中的一个核心组件,用于创建和处理表单元素,包括输入字段、按钮、选择框等。它提供了丰富的功能,如数据验证、远程提交、异步加载等,是构建用户交互界面的关键部分。 在ExtJS中,FormPanel是...

    Extjs3.0 checkboxGroup 动态添加item实现思路

    在探讨Extjs3.0中CheckboxGroup动态添加item的问题之前,首先要了解Extjs3.0的CheckboxGroup组件。CheckboxGroup允许用户在一个组合框内选择多个选项,与单选按钮组RadioGroup相反,它是多个复选框的集合。然而,与...

    ExtJs4.0 表单提交Demo

    在“ExtJs4.0 表单提交Demo”中,我们将深入探讨如何在ExtJs 4.0环境下,通过Ext Ajax模块实现表单的数据提交,同时实现显示层和控制层的分离,提升代码的可维护性和可扩展性。 1. **ExtJs 4.0 表单基础** ExtJs ...

    ExtJs中表单formPanel的横向布局

    在ExtJs框架中,表单的设计与布局是一个关键部分,特别是在需要创建复杂、响应式界面时。本文将深入探讨如何在ExtJs中使用`FormPanel`组件结合`form`和`column`布局属性来实现横向布局,即在一个表单中元素能够按照...

    extJs中关于formPanel动态添加组件的验证问题

    然而,在实际开发过程中,我们可能会遇到需要动态添加组件到FormPanel中的需求,这就会带来一些验证上的挑战。这篇博客将探讨如何解决EXT JS中关于FormPanel动态添加组件的验证问题。 首先,让我们理解EXT JS ...

    Extjs4的FormPanel从后台load json数据的要点

    在本篇文章中,我们将深入探讨如何使用Extjs4中的FormPanel组件从后台加载JSON数据,并将其映射到表单的各个字段中进行显示。这是一项非常实用的技术,尤其是在需要动态填充表单的情况下。 ### 一、Extjs4 ...

    ext checkboxgroup 回填数据解决

    重写 代码如下: //解决checkboxgroup回填数据问题 Ext.override(Ext.form.BasicForm,{ findField : function(id){ var field = this.items.get(id); if(!field){ this.items.each(function(f){ if(f.isXType(...

    ExtJs中文API

    ExtJs中文API,比较全面!并且提供了很多的例子!! ExtJs中文API,比较全面!并且提供了很多的例子!! ExtJs中文API,比较全面!并且提供了很多的例子!! ExtJs中文API,比较全面!并且提供了很多的例子!!

    解决 extjs2.2 给tree-panel 添加 checkbox 的add-on

    在EXTJS 2.2版本中,Tree Panel是EXTJS框架中用于展示树形结构数据的一个组件,但原生的EXTJS 2.2并未提供内置的复选框(checkbox)功能,这对于需要用户进行多选操作的场景来说是一个限制。标题提到的“解决extjs...

    extjs 初始化checkboxgroup值的代码

    代码如下: Ext.override(Ext.form.CheckboxGroup,{ setValueForItem : function(val){ //多个选项值以逗号分开的 val = “,”+val+”,” this.items.each(function(item) { if (val.indexOf(item.inputValue) &gt; -1) ...

    EXTJS4.2 Sencha Architect22 treegrid tree checkbox

    EXTJS4.2 Sencha Architect22 treegrid tree checkbox treegrid tree 通过store显示内容,能够通过checkbox点击勾选 其他功能,网上都能找到,就没有再写

    ExtJs4 Checkbox tree

    ExtJs4 Checkbox Tree是基于ExtJs 4框架实现的一种特殊树形组件,它在传统的树形结构基础上增加了复选框功能。这种组件常用于需要用户多选树形数据的场景,比如权限设置、目录选择等。下面将详细介绍ExtJs4 Checkbox...

    extjs中文文档大全

    ExtJS是一种基于JavaScript的开源富客户端框架,用于构建桌面级的Web应用程序。它提供了一整套组件化的用户界面元素和强大的数据绑定机制,使得开发者能够创建功能丰富的、交互性强的Web应用。本文档集合包括了...

    ExtJS改变默认字体大小的几种方式

    在使用ExtJS时,有时我们需要根据用户需求或设计规范调整界面的字体大小。以下是改变ExtJS默认字体大小的几种方法: 1. 修改样式文件:最直接的方法是编辑`ext-all.css`样式文件。将文件中所有涉及到字体大小为11px...

    绝对好用!extjs中本地照片预览、blob数据在oracle中存取.zip

    此压缩包中完全能实现的功能是在extjs中让本地照片预览,并且将地址传递给java后台,将图片文件以blob的形式存储到oracle数据库,并且可以默认将数据库中的数据第一次加载在预览框里(也就是从数据库中读出blob数据...

    ExtJs 动态添加表单

    在"动态添加表单"这个主题中,我们将深入探讨如何在ExtJS中实现表单的动态创建和管理。 首先,我们要理解表单(Form)在ExtJS中的基本概念。表单是数据输入和验证的核心组件,可以包含各种字段类型,如文本框、下拉...

    extjs中的xtype的所有类型介绍

    ExtJS 中的 xtype.typename 介绍 ExtJS 中的 xtype 是一个非常重要的概念,它用于定义组件的类型,从而确定组件的行为和样式。xtype 是 ExtJS 的核心组件之一,它提供了大量的组件类型,满足不同场景下的需求。 ...

Global site tag (gtag.js) - Google Analytics