`
eatsun1983
  • 浏览: 4308 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

EXT项目中复选框列(checkcolumn)的应用实例

阅读更多

      从来没有发过关于技术的文章,基本都是在学习。最近项目用到了EXT的复选框列,在网上找了找,没有很直接的,符合我们需求的例子。参考了yourgame兄官方扩展的文章(http://yourgame.iteye.com/blog/245619),结合实际需求,完成了工作,记录一下,以备需要的同志们参考和自己以后查询。

      抽出来的需求是这样的:

      有一些项目,这些项目都可以解决特定的问题,先看下库中的结构,包括“问题id”,“问题名称”,“分数”三个字段,其中问题类型的分数为加权分数(如F01),其他是具体分数(如F0101)。

      要做的工作就是在页面将问题展示出来,划勾同时计算相应加权分数,有保存功能等,如图所示:

      要求“本项目可解决”列——能解决问题自动打钩,不能解决的不打勾,加权分数行不需要显示checkbox,在此基础上可人为手动标记,点击保存后存入库中。

      解决思路大致如下:

 

      1 参考官方扩展示例,进行细微修改,适应需求:

      通过正则进行匹配,凡是形如“F01”的行不进行渲染,即不显示本行checkbox。

 

      2 页面与后台数据对应如下:

      前台store

      /*************************问题数据****************************/
      var jjwt_store = new Ext.data.JsonStore({
            url:"gcxmghgl.html?m=getJjwt&xmid=${xmid}",
            totalProperty:"totalCount",
            root:"results",
            id: 'wtid',
            fields:["wtid","fs","jj","mc"]
      });

 

      后台sql

      select t.wtid, t.fs, decode(w.wtid, null, '', 'true') jj, t.mc
      from gh_pw_gc_wtzb t
      left outer join (select g.wtid from gh_pw_gc_xmwt g where g.xmid = 6288) w
      on (t.wtid = w.wtid)
      order by t.wtid

 

      后台wtid、fs、jj、mc分别对应前台fields数组项

      注意后台处理:decode(w.wtid, null, '', 'true') jj,jj为''或非''反映到页面便是划勾与否。

 

      3 接下来就是在页面构建分数计算模型,这里就是几个js对象:

 

        //问题对象基类
        function Wt(wtid,fs,jj,mc) {
            this.wtid = wtid;
            this.fs = parseInt(fs);
            this.jj = jj;
            this.mc = mc;
        }
       
        //主问题对象(类别)
        function MainWt(wtid,fs,jj,mc) {
            Wt.call(this,wtid,fs,jj,mc);
        }
        MainWt.prototype = new Wt();
       
        //具体问题对象
        function SubWt(wtid,fs,jj,mc) {
            Wt.call(this,wtid,fs,jj,mc);
        }
        SubWt.prototype = new Wt();
        SubWt.prototype.changeState = function() {
            if(this.jj === 'true') {
                this.jj = '';
            }
            else {
                this.jj = 'true';
            }
        }

      主要问题对象和具体问题对象都继承自问题对象基类。

 

        //问题组对象
        var WtGroup = function() {
            this.mainWt = null;
            this.subWts = new Array();
            this.subTotalScore = 0;
           
            this.setMainWt = function(wt) {
                this.mainWt = wt;
            }
            this.setSubWt = function(subWt) {
                this.subWts.push(subWt);
            }
            this.getSubTotalScore = function() {
                if(this.subTotalScore === 0) {
                    for(var i=0;i<this.subWts.length;i++) {
                        this.subTotalScore += this.subWts[i].fs;
                    }
                }
                return this.subTotalScore;
            }
            this.changeState = function(subWtId) {   
                var sub;
                for(var i=0;i<this.subWts.length;i++) {
                    sub = this.subWts[i];
                    if(sub.wtid === subWtId) {
                        sub.changeState();
                    }
                }
            }
           
            //计算组得分
            this.calculateGroup = function() {
                var groupScore = 0;
                var s = 0;
                for(var i=0;i<this.subWts.length;i++) {
                    if(this.subWts[i].jj === 'true') {
                        s += this.subWts[i].fs;
                    }
                }
                //groupScore = forDight(s*(this.mainWt.fs/this.getSubTotalScore()),2);
                groupScore = forDight(s*this.mainWt.fs/100,2);
                return groupScore;
            }   
           
            this.getCheckedWtid = function() {
                var groupArr = new Array();
                for(var i=0;i<this.subWts.length;i++) {
                    if(this.subWts[i].jj === 'true') {
                        groupArr.push(this.subWts[i].wtid);
                    }
                }
                return groupArr;
            }     
        }

      问题组对象主要描述一组问题的状态和行为(如“问题类型1”及其具体问题)。

 

        //计算对象类,负责页面的计算
        function Cal(store,fj1,fj2) {
            this.tableChange = false;
            this.fj1Change = false;
            this.fj2Change = false;
            this.fj1 = parseInt(fj1);
            this.fj2 = parseInt(fj2);
            this.mPattern = new RegExp('^F0\\d$');
            this.store = store;
            this.wtGroups = new Array();
           
            this.init = function() {
                var recordCount = this.store.getCount();
                var rec;
               
                //初始化各组的主问题
                for(var i=0;i<recordCount;i++) {
                    rec = this.store.getAt(i);
                    if(this.mPattern.test(rec.get('wtid'))) {
                        var mWt = new MainWt(rec.get('wtid'),rec.get('fs'),rec.get('jj'),rec.get('mc'));
                        var wtGroup = new WtGroup();
                        wtGroup.setMainWt(mWt);
                        this.addWtGroup(wtGroup);
                    }
                }
                //初始化各组的具体问题
                for(var j=0;j<this.wtGroups.length;j++) {
                    var gWt = this.wtGroups[j].mainWt.wtid;
                    for(var k=0;k<recordCount;k++) {
                        rec = this.store.getAt(k);
                        if(!this.mPattern.test(rec.get('wtid'))) {
                            var sWt = new SubWt(rec.get('wtid'),rec.get('fs'),rec.get('jj'),rec.get('mc'));
                            if(gWt === rec.get('wtid').substring(0,3)) {
                                this.wtGroups[j].setSubWt(sWt);
                            }
                        }
                    }
                }
            }
           
            this.setFj1 = function(fj1) {
                this.fj1 = parseInt(fj1);
                this.fj1Change = true;
            }
           
            this.setFj2 = function(fj2) {
                this.fj2 = parseInt(fj2);
                this.fj2Change = true;
            }
           
            this.getFjfs = function() {
                var arr = new Array();
                arr.push(this.fj1);
                arr.push(this.fj2);
                return arr.join(',');
            }
           
            this.changeState = function(subWtId) {
                this.tableChange = true;
                for(var i=0;i<this.wtGroups.length;i++) {
                    if(subWtId.substring(0,3) === this.wtGroups[i].mainWt.wtid) {
                        this.wtGroups[i].changeState(subWtId);
                        break;
                    }
                }
            }
           
            this.addWtGroup = function(wtGroup) {
                this.wtGroups.push(wtGroup);
            }
           
            this.calculateAllSrc = function() {
                var totalScore = 0;
                for(var i=0;i<this.wtGroups.length;i++) {
                    totalScore += this.wtGroups[i].calculateGroup();
                }
                return forDight(totalScore,2);
            }
           
            this.calculateAll = function() {
                var totalScore = this.calculateAllSrc();
               
                totalScore += this.fj1;
                totalScore += this.fj2;
                return totalScore;
            }
           
            //得到所有打钩的问题id
            this.getAllWtid = function() {
                var allWtid = new Array();
                //得到打钩的问题id
                for(var i=0;i<this.wtGroups.length;i++) {
                    if(this.wtGroups[i].getCheckedWtid().length > 0) {
                        for(var j=0;j<this.wtGroups[i].getCheckedWtid().length;j++) {
                            allWtid.push(this.wtGroups[i].getCheckedWtid()[j]);
                        }
                    }   
                }
                return allWtid.join(',');
            }
           
            this.getGroupScores = function() {
                var groupScoreArr = new Array();
                for(var i=0;i<this.wtGroups.length;i++) {
                    groupScoreArr.push(this.wtGroups[i].calculateGroup());
                }
                return groupScoreArr.join(',');
            }
        }

      页面计算对象,将store传入,通过页面状态结合点击事件计算分数值。

 

      这里主要记录了复选框列在项目中的具体一些应用,因为看到网上例子较少,所以写出来供大家参考。时间紧代码没有细琢,以满足功能为主。

      笔者邮箱:eatsun1983@sina.com

分享到:
评论

相关推荐

    Ext TreePanel Checked Ext复选框树

    在描述中提到的"Ext TreePanel Checked Ext复选框树"是指`TreePanel`的一种特殊形式,它扩展了基本的树视图,加入了复选框功能。 复选框树(Checked Tree)允许用户通过复选框来选择或取消选择树结构中的节点。这种...

    基于EXT2.2的下拉复选框

    总的来说,"基于EXT2.2的下拉复选框"是一个利用EXT2.2框架和相关插件实现的Web组件,它提供了在下拉列表中多选的功能,这通常涉及对EXT2.2的`ComboBox`组件进行扩展,使用自定义的JavaScript插件(如`Ext.mm....

    带复选框的下拉框

    总的来说,"带复选框的下拉框"是一个在Ext JS框架中实现的自定义组件,它提供了在下拉列表中选择多个选项的能力。通过解决不同版本的兼容性问题,这个组件可以在3.2至3.4版本的Ext JS中稳定工作。对于需要多选功能的...

    解决Extjs当中复选框全选后,取消选中某一项,全选框仍是选中状态的问题

    然而,在实际应用中,我们可能会遇到一个问题:当实现全选功能后,如果尝试取消选中其中的一项,全选复选框仍然保持选中状态,这显然不符合用户的预期。本文将深入探讨这个问题,并提供解决方案。 首先,我们需要...

    ext复选框的ColumnTree扩展包

    通过引入这个扩展,开发者可以快速地为自己的EXT应用增加复选框功能,提高用户操作的直观性和效率。在实际应用中,还需要考虑性能优化、用户体验设计以及错误处理等多个方面,确保程序的稳定性和易用性。

    ext4实现带复选框的多选下拉框

    总结来说,"ext4实现带复选框的多选下拉框"涉及了前端开发中的CSS样式设计、JavaScript编程、服务器端交互以及可能的第三方库或框架的使用。理解这些知识点,对于开发高效且用户体验良好的Web应用至关重要。

    extjs4.1下拉复选框完整DEMO

    1. **创建下拉复选框组件**:使用`Ext.create`方法实例化`Ext.form.field.CheckboxGroup`,并配置相关属性,如字段名、列宽、布局等。 2. **配置store**:为下拉复选框关联一个`Ext.data.Store`,该store负责从...

    带复选框的 ExtJs tree

    在给定的文件中,我们关注的是“带复选框的ExtJS tree”这一主题,这涉及到ExtJS框架下的树形组件(TreePanel)如何与复选框结合,为用户提供更为灵活的数据选择和管理方式。 ### 标题解析:“带复选框的ExtJS tree...

    extjs带复选框的树包括全选 反选 子选父以及 父选子

    当树形组件结合复选框时,可以实现用户对节点的选择操作,如全选、反选、子选父以及父选子。这些功能在数据管理、权限分配等场景中非常实用。 首先,我们要理解ExtJS树形组件的基本构造。一个树形组件由节点(Nodes...

    javascript下拉多选框复选框

    在本项目中,我们探讨的是如何使用纯JavaScript实现一个功能丰富的下拉多选框,而不是依赖于像jQuery这样的库,尤其是jQuery的multiselect插件。 首先,让我们了解下拉多选框(Dropdown)和复选框(Checkbox)的...

    EXT 项目下拉列表多选框 使用示例 含源代码

    总结来说,这个示例提供了一个在Java EXT项目中使用下拉列表多选框的实例,包括配置、数据绑定、事件处理和样式定制等方面,对于初学者或者需要在项目中应用这一功能的开发者来说,是一个非常有价值的参考资料。...

    EXT TREE 扩展CHECKBOX JS

    EXT TREE扩展CHECKBOX JS是一种在EXT JS框架下对树形组件(Tree Panel)进行增强,实现复选框功能的技术。EXT JS是一个强大的JavaScript GUI库,它提供了丰富的组件和功能,用于构建复杂的Web应用程序。在EXT JS中,...

    ext项目实例源码

    ext项目实例源码

    Ext 三态 复选树

    在IT行业中,"Ext 三态复选树"是一个关于前端开发的概念,特别是与使用ExtJS框架构建用户界面相关的。ExtJS是一个强大的JavaScript库,用于创建桌面应用的复杂用户界面。在这个场景中,"三态复选树"指的是在树形结构...

    extjs3.X 带复选框的树

    "带复选框的树"是ExtJS中的TreePanel组件的一个扩展,允许用户通过复选框选择树结构中的节点。这种功能在数据层级结构的管理和筛选中非常有用,例如在组织架构、文件系统或者权限设置中。 复选框树的核心在于`...

    Ext项目小框架介绍源码

    在这个例子中,index.html可能加载了必要的CSS和JavaScript文件,初始化了Ext应用,并设置了页面的布局和组件。 2. **public**:这是一个公共目录,可能包含了项目的静态资源,如图片、样式表(CSS)和JavaScript...

    Ext表单组件之checkbox

    在Ext JS中,复选框是`Ext.form.field.Checkbox`类的实例,提供了一套完整的API来处理用户的选中和未选中状态。 2. **创建复选框** 创建一个基本的复选框,你需要定义一个配置对象,包括`xtype`属性来指定组件类型...

    EXT_JS实例,官方实例

    6. **表单组件**:EXT JS提供了一系列表单组件,如文本框(TextField)、下拉列表(ComboBox)、复选框(Checkbox)、单选按钮(RadioButton)等。这些组件可以轻松创建复杂的表单并实现数据验证。 7. **Ajax通信**...

    ext 实例集

    "帮助"标签意味着这个实例集可能是为了解决EXT使用中遇到的问题或提供指导而设计的。每个示例通常会包含完整的源代码,以及详细的注释,帮助理解其工作原理。通过查看和运行这些示例,学习者可以快速掌握EXT的各种...

Global site tag (gtag.js) - Google Analytics