`

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使用过程中积攒的一些东西

    - 表单控件:FormPanel可以包含各种表单元素,如文本框`textfield`、密码框`passwordfield`、选择框`checkbox`、复选框组`checkboxgroup`、单选框`radiogroup`、下拉框`combobox`、日期选择器`datefield`等。...

    ExtJs_xtype一览

    - `checkboxgroup`:`Ext.form.CheckboxGroup`,自2.2版本起,用于组织多个多选框的组件。 - `displayfield`:`Ext.form.DisplayField`,只读显示,不参与验证和提交的文本字段。 - `radiogroup`:`Ext.form....

    学习ExtJS Panel常用方法

    - `checkboxgroup`: `Ext.form.CheckboxGroup` - `combo`: `Ext.form.ComboBox` - `datefield`: `Ext.form.DateField` - `displayfield`: `Ext.form.DisplayField` - `field`: `Ext.form.Field` - `fieldset`:...

    extjs控件列表

    **Ext.form.CheckboxGroup** - **描述**: 编组的多选框,可以同时管理多个多选框。 - **用途**: 创建一组相关联的多选框,如兴趣爱好选择。 **Ext.form.DisplayField** - **描述**: 仅显示,不校验/不被提交的...

    本程序使用Matlab调用COMSOL进行二元(电容与相对介电常数)数据的生成.zip

    matlab

    操作系统课程设计基于C++实现的操作系统仿真虚拟页式存储管理项目源代码

    操作系统课程设计基于C++实现的操作系统仿真虚拟页式存储管理项目源代码

    西门子S7-1500与V90伺服在定长切断中的应用及优化 - 工业自动化解决方案

    内容概要:本文详细介绍了西门子S7-1500 PLC与V90伺服在定长切断应用中的具体实现方法和技术要点。首先,文章展示了如何利用TIA Portal V16平台配置工艺对象“CuttingAxis”,并解释了关键参数如每转脉冲数、丝杆导程、减速比等的作用。接着,针对可能出现的问题,如轴运行抖动、控制字状态丢失等进行了深入探讨,并提供了相应的解决措施,比如调整前馈参数、修改报文配置等。此外,还分享了一些提高系统性能的小技巧,例如启用动态限制选项、优化速度前馈与位置环配合等。最后,强调了该方案在包装机械和线材加工领域的广泛应用前景及其优势所在。 适合人群:从事工业自动化相关工作的工程师和技术人员,尤其是那些希望深入了解和掌握西门子PLC与伺服系统集成应用的专业人士。 使用场景及目标:适用于需要实现高精度定长切断操作的企业或项目,旨在帮助用户构建稳定可靠的控制系统,确保生产效率和产品质量。 其他说明:文中不仅涵盖了理论知识讲解,还包括大量实际案例分析以及代码示例,便于读者更好地理解和应用所学内容。同时提醒读者关注硬件配置、软件编程、参数调节等多个方面,以达到最佳效果。

    2023年计算机二级Office选择题考前模拟.docx

    2023年计算机二级Office选择题考前模拟.docx

    CMD仿制PYTHON,自己制作,望通过

    目前可以新建目录,具体自己看代码

    基于SpringBoot网上超市(源码+数据库+万字文档)507

    基于SpringBoot网上超市,系统包含两种角色:用户、管理员,系统分为前台和后台两大模块,主要功能如下: 1 管理员功能实现 商品信息管理 管理员可以通过提交商品名称查询商品,并查看该商品的用户评论信息。 用户管理 管理员通过提交用户名来获取用户资料,对有异常情况的用户信息进行修改,并可以详细查看用户资料。 商品评价管理 管理员审核用户对商品的评价,经过审核的评价才会显示,并可以统计商品评价信息。 已支付订单 管理员查看已支付的订单,并逐个进行订单发货。 2 用户功能实现 商品信息 用户可以收藏、立即购买商品,或对商品进行评价,同时将商品添加到购物车。 购物车 用户可以直接下单购买购物车中的商品,或删除购物车中的商品。 确认下单 用户选择地址,查看支付金额信息,以确认订单之前的所有细节。 已支付订单 用户查看已支付的订单,若对购买商品产生后悔,可以申请退款。 二、项目技术 开发语言:Java 数据库:MySQL 项目管理工具:Maven Web应用服务器:Tomcat 前端技术:Vue、 后端技术:SpringBoot框架 三、运行环境 操作系统:Windows、macOS都可以 JDK版本:JDK1.8以上版本都可以 开发工具:IDEA、Ecplise都可以 数据库: MySQL 5.7/8.0版本均可 Tomcat:7.x、8.x、9.x版本均可 Maven:任意版本都可以

    1_媒工十佳决赛RUNDOWN 2.xlsx

    1_媒工十佳决赛RUNDOWN 2.xlsx

    c#联合opencvsharp开发的视觉源码程序包含模板匹配,找线找圆,预处理等功能全部源码,包含图像显示控件,绘制roi

    c#联合opencvsharp开发的视觉源码程序 包含模板匹配,找线找圆,预处理等功能 全部源码,包含图像显示控件,绘制roi

    基于STC89C52单片机的信号发生器20172086102何雨莉_3.zip

    基于STC89C52单片机的信号发生器20172086102何雨莉_3.zip

    2023年西南大学网络与继续教育学院楼宇自动化作业答案.docx

    2023年西南大学网络与继续教育学院楼宇自动化作业答案.docx

    基于SpringBoot与Vue的智慧养老手表管理系统:家庭树、健康数据监控及权限控制

    内容概要:本文详细介绍了基于SpringBoot和Vue构建的智慧养老手表管理系统的关键技术和实现细节。系统主要由家长和养老院管理员两种角色组成,家长可以通过智能手表实时查看老人的健康数据,而管理员则可以进行更全面的数据管理和权限控制。文中重点讨论了家庭树功能的实现,包括使用MyBatis的动态SQL处理复杂的家庭关系查询,以及前端用Vue的el-tree组件展示家庭树结构。健康数据监控方面,系统利用SpringBoot的@Scheduled定时任务生成日报,并通过ECharts进行数据可视化。此外,还涉及了权限控制、加好友功能、熔断机制等多个方面的技术实现。 适合人群:具有一定编程经验的开发者,尤其是熟悉SpringBoot和Vue框架的工程师。 使用场景及目标:适用于开发类似智慧养老系统的项目,旨在提高老年人健康管理的效率和安全性。目标是通过智能手表实时监测老人健康状况,提供及时的健康报告和预警,同时确保系统的稳定性和安全性。 其他说明:文中提到的技术细节对于理解和实现类似的前后端分离架构非常有帮助,特别是关于MySQL 5.7的使用和优化,以及如何处理第三方设备接口的不稳定问题。

    2023年计算机二级资料.doc

    2023年计算机二级资料.doc

    2023年电大数据结构形成性考核册.doc

    2023年电大数据结构形成性考核册.doc

    软考-网络工程师易错100题 2025年

    网络工程师易错100题 2025年

    2023年电子商务技能竞赛方案.doc

    2023年电子商务技能竞赛方案.doc

    2024年大数据软件项目深度研究分析报告.docx

    2024年大数据软件项目深度研究分析报告.docx

Global site tag (gtag.js) - Google Analytics