从来没有发过关于技术的文章,基本都是在学习。最近项目用到了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复选框树"是指`TreePanel`的一种特殊形式,它扩展了基本的树视图,加入了复选框功能。 复选框树(Checked Tree)允许用户通过复选框来选择或取消选择树结构中的节点。这种...
总的来说,"基于EXT2.2的下拉复选框"是一个利用EXT2.2框架和相关插件实现的Web组件,它提供了在下拉列表中多选的功能,这通常涉及对EXT2.2的`ComboBox`组件进行扩展,使用自定义的JavaScript插件(如`Ext.mm....
总的来说,"带复选框的下拉框"是一个在Ext JS框架中实现的自定义组件,它提供了在下拉列表中选择多个选项的能力。通过解决不同版本的兼容性问题,这个组件可以在3.2至3.4版本的Ext JS中稳定工作。对于需要多选功能的...
然而,在实际应用中,我们可能会遇到一个问题:当实现全选功能后,如果尝试取消选中其中的一项,全选复选框仍然保持选中状态,这显然不符合用户的预期。本文将深入探讨这个问题,并提供解决方案。 首先,我们需要...
通过引入这个扩展,开发者可以快速地为自己的EXT应用增加复选框功能,提高用户操作的直观性和效率。在实际应用中,还需要考虑性能优化、用户体验设计以及错误处理等多个方面,确保程序的稳定性和易用性。
总结来说,"ext4实现带复选框的多选下拉框"涉及了前端开发中的CSS样式设计、JavaScript编程、服务器端交互以及可能的第三方库或框架的使用。理解这些知识点,对于开发高效且用户体验良好的Web应用至关重要。
1. **创建下拉复选框组件**:使用`Ext.create`方法实例化`Ext.form.field.CheckboxGroup`,并配置相关属性,如字段名、列宽、布局等。 2. **配置store**:为下拉复选框关联一个`Ext.data.Store`,该store负责从...
在给定的文件中,我们关注的是“带复选框的ExtJS tree”这一主题,这涉及到ExtJS框架下的树形组件(TreePanel)如何与复选框结合,为用户提供更为灵活的数据选择和管理方式。 ### 标题解析:“带复选框的ExtJS tree...
当树形组件结合复选框时,可以实现用户对节点的选择操作,如全选、反选、子选父以及父选子。这些功能在数据管理、权限分配等场景中非常实用。 首先,我们要理解ExtJS树形组件的基本构造。一个树形组件由节点(Nodes...
在本项目中,我们探讨的是如何使用纯JavaScript实现一个功能丰富的下拉多选框,而不是依赖于像jQuery这样的库,尤其是jQuery的multiselect插件。 首先,让我们了解下拉多选框(Dropdown)和复选框(Checkbox)的...
总结来说,这个示例提供了一个在Java EXT项目中使用下拉列表多选框的实例,包括配置、数据绑定、事件处理和样式定制等方面,对于初学者或者需要在项目中应用这一功能的开发者来说,是一个非常有价值的参考资料。...
EXT TREE扩展CHECKBOX JS是一种在EXT JS框架下对树形组件(Tree Panel)进行增强,实现复选框功能的技术。EXT JS是一个强大的JavaScript GUI库,它提供了丰富的组件和功能,用于构建复杂的Web应用程序。在EXT JS中,...
ext项目实例源码
在IT行业中,"Ext 三态复选树"是一个关于前端开发的概念,特别是与使用ExtJS框架构建用户界面相关的。ExtJS是一个强大的JavaScript库,用于创建桌面应用的复杂用户界面。在这个场景中,"三态复选树"指的是在树形结构...
"带复选框的树"是ExtJS中的TreePanel组件的一个扩展,允许用户通过复选框选择树结构中的节点。这种功能在数据层级结构的管理和筛选中非常有用,例如在组织架构、文件系统或者权限设置中。 复选框树的核心在于`...
在这个例子中,index.html可能加载了必要的CSS和JavaScript文件,初始化了Ext应用,并设置了页面的布局和组件。 2. **public**:这是一个公共目录,可能包含了项目的静态资源,如图片、样式表(CSS)和JavaScript...
在Ext JS中,复选框是`Ext.form.field.Checkbox`类的实例,提供了一套完整的API来处理用户的选中和未选中状态。 2. **创建复选框** 创建一个基本的复选框,你需要定义一个配置对象,包括`xtype`属性来指定组件类型...
6. **表单组件**:EXT JS提供了一系列表单组件,如文本框(TextField)、下拉列表(ComboBox)、复选框(Checkbox)、单选按钮(RadioButton)等。这些组件可以轻松创建复杂的表单并实现数据验证。 7. **Ajax通信**...
"帮助"标签意味着这个实例集可能是为了解决EXT使用中遇到的问题或提供指导而设计的。每个示例通常会包含完整的源代码,以及详细的注释,帮助理解其工作原理。通过查看和运行这些示例,学习者可以快速掌握EXT的各种...