dojo中的grid的改进

在dojo中有个强大而实用的组件Grid,但是在实际使用的时候,它有以下一些小问题。

    没有相应的pagenavigation组件,它的分页机制是在鼠标向下滚动时自动请求后端获取数据的,这样做,在数据量比较大(上万条)的时候,客户端保存了大量的数据,容易造成客户端卡死现象。

 

  对于这两个问题,针对dojo的grid做了以下扩展:

 

dojo.provide("navigationGrid");

dojo.require("dojox.grid.DataGrid");
dojo.require('dijit.Toolbar');
dojo.require("dijit.form.Button");
dojo.require("dijit.ToolbarSeparator");
dojo.declare("navigationGrid", dojox.grid.DataGrid, {
	// 当前页码号
	currentPage:1,
	totalPage:1,
	maxPageNum:5,
	// 页码按钮
	_pageBtns:null,
	// 导航条对象
	_naviBar:null,
	_firstBtn:null,
	_prviousBtn:null,
	_nextBtn:null,
	_lastBtn:null,
	_pageLoaded:false,
	
	postCreate: function(){
		this.inherited(arguments);
		this._pageBtns = [];
		this._naviBar = new dijit.Toolbar(
		{
			style:"width:100%;text-align:right"
		});
		this._firstBtn = new dijit.form.Button({
			label:"首页"
			,disabled:true
			,iconClass:"navi-first",
			onClick:dojo.hitch(this,"_locate",'first')
		});
		this._prviousBtn = new dijit.form.Button({
			label:"上一页"
			,disabled:true
			,iconClass:"navi-previous",
			onClick:dojo.hitch(this,"_locate",'pre')
		});
		this._nextBtn = new dijit.form.Button({
			label:"下一页"
			,disabled:true
			,dir:"rtl"
			,iconClass:"navi-next",
			onClick:dojo.hitch(this,"_locate",'next')
			});
		this._lastBtn = new dijit.form.Button({
			label:"末页"
			,disabled:true
			,dir:"rtl"
			,iconClass:"navi-last",
			onClick:dojo.hitch(this,"_locate",'last')
		});
		this._naviBar.addChild(this._firstBtn);
		this._naviBar.addChild(new dijit.ToolbarSeparator());
		this._naviBar.addChild(this._prviousBtn);
		this._naviBar.addChild(new dijit.ToolbarSeparator());
		this._naviBar.addChild(this._nextBtn);
		this._naviBar.addChild(new dijit.ToolbarSeparator());
		this._naviBar.addChild(this._lastBtn);
		this._naviBar.placeAt(this.domNode,"after");
		// this._naviBar.startup();
	},
	
	_locate:function(s){
		switch(s){
			case 'first':
				this._navigate(1);
				break;
			case 'pre':
				this._navigate(this.currentPage - 1);
				break;
			case 'next':
				this._navigate(this.currentPage + 1);
				break;
			case 'last':
				this._navigate(this.totalPage);
				break;
			default:
				break;
		}
	},
	_updateBtnStatus:function(pageNo){
		/*
		 * 更新按钮的状态和样式
		 */
		if(pageNo > 1){
			this._firstBtn.set('disabled',false);
			this._prviousBtn.set('disabled',false);
		}else{
			this._firstBtn.set('disabled',true);
			this._prviousBtn.set('disabled',true);
		}
		if(pageNo < this.totalPage){
			this._nextBtn.set('disabled',false);
			this._lastBtn.set('disabled',false);
		}else{
			this._nextBtn.set('disabled',true);
			this._lastBtn.set('disabled',true);
		}
		
		// 清除当前页的样式
		/*var currentPageIdx = (this.maxPageNum?this.currentPage%this.maxPageNum:this.maxPageNum) - 1;
		var pageNoIdx = (this.maxPageNum?pageNo%this.maxPageNum:this.maxPageNum) -1;
		pageNoIdx = pageNoIdx < 0?this.maxPageNum -1 :pageNoIdx;
		if(this._pageBtns[currentPageIdx]){
			this._pageBtns[currentPageIdx].set('class','');
		}
		if(this._pageBtns[pageNoIdx]){
			this._pageBtns[pageNoIdx].set('class','navi-currentPage');
		}*/
	},
	/**
	 * 重新载入当前页面
	*/
	reload:function(){
		var row = this._pageToRow(this.currentPage - 1);
		this._fetch(row,true);
	},
	/*
	 * 指向导航页面
	 */
	_navigate:function(pageNo){
		if(this.currentPage==pageNo){return}
		if(pageNo < 1 || pageNo > this.totalPage){return}
		this._updateBtnStatus(pageNo);
		var row = this._pageToRow(pageNo - 1);
		this.currentPage = pageNo;
		//this._clearData();
		this._fetch(row,true);
	},
	_onFetchComplete:function(items, req){
		if(!this.scroller){ return; }
		if(items && items.length > 0){
			// console.log(items);
			/*for(var i=0;i<this.rowsPerPage;i++){
				if(items.length > i){
					this._addItem(items[i],i,true);
				}else{
					this._addItem({},i,true);
				}
			}*/
			dojo.forEach(items, function(item, idx){
				this._addItem(item, idx, true);
			}, this);
			
			if(this._autoHeight){
				this._skipRowRenormalize = true;
			}
			this.updateRowCount(items.length);
			this.updateRows(0, items.length);
			if(this._autoHeight){
				this._skipRowRenormalize = false;
			}			
			if(req.isRender){
				this.setScrollTop(0);
				this.postrender();
			}else if(this._lastScrollTop){
				this.setScrollTop(this._lastScrollTop);
			}
		}
		delete this._lastScrollTop;
		if(!this._isLoaded){
			this._isLoading = false;
			this._isLoaded = true;
		}
		this._pending_requests[req.start] = false;
	},
	
	// 重写父类的方法,初始化导航数字按钮
	_onFetchBegin:function(size, req){
		this._updateButtons(size);
		if(!size){
			this.views.render();
			this._resize();
			this.showMessage(this.noDataMessage);
			this.focus.initFocusView();
			return;
		}else{
			this.showMessage();
		}
		
		if(!this.scroller){ return; }
		if(this.rowCount != this.rowsPerPage){
			if(req.isRender){
				this.scroller.init(this.rowsPerPage, this.rowsPerPage, this.rowsPerPage);
				this.rowCount = this.rowsPerPage;
				this._setAutoHeightAttr(this.autoHeight, true);
				this._skipRowRenormalize = true;
				this.prerender();
				this._skipRowRenormalize = false;
			}else{
				this.updateRowCount(this.rowsPerPage);
			}
		}
	},
	
	_clearData: function(){
		this.inherited(arguments);
		this.currentPage=1;
		this.totalPage=1;
		dojo.forEach(this._pageBtns,function(btn){
			btn.destroy();
		})
		this._pageBtns=[];
		if(this._firstBtn){
			this._firstBtn.set('disabled',false);
		}
		if(this._prviousBtn){
			this._prviousBtn.set('disabled',false);
		}
		if(this._nextBtn){
			this._nextBtn.set('disabled',false);
		}
		if(this._lastBtn){
			this._lastBtn.set('disabled',false);
		}
		this._pageLoaded=false;
	},
	_updateButtons:function(size){
		//TODO 先销毁按钮组
		if(this._pageBtns){
			dojo.forEach(this._pageBtns,function(element){
				element.destroy();
			})
			this._pageBtns = [];
		}
		// 初始化数字按钮条
		var totalPage = (this.rowsPerPage ? Math.ceil(size / this.rowsPerPage) : size);
		var isShow = false;
		var isFirstRightDot = false;
		var isFirstLefttDot = false;
		var beginIndex = 4;
		for (var i = 1; i <= totalPage; i++){
			if (i == 1 || i == 2 || i == totalPage || i == totalPage - 1
					|| i == this.currentPage - 1 || i == this.currentPage - 2
					|| i == this.currentPage + 1 || i == this.currentPage + 2) {
				isShow = true;
			}
			if (this.currentPage == i) {
				var numBtn = new dijit.form.Button({
					label:i,
					baseClass:"",
					tooltip:"第"+i+"页",
					style:{border:"1px solid #A8AAE2",margin:"1px"},
					cssStateNodes: {"titleNode":"navi"},
					onClick:dojo.hitch(this,"_navigate",i)
				});
				this._pageBtns.push(numBtn);
				numBtn.set('disabled',true);
				dojo.addClass(numBtn.domNode,'navi-selected');
				this._naviBar.addChild(numBtn,beginIndex);
				beginIndex++;
			} else {
				if (isShow == true) {
					var numBtn = new dijit.form.Button({
						label:i,
						baseClass:"",
						tooltip:"第"+i+"页",
						style:{border:"1px solid #A8AAE2",margin:"1px"},
						cssStateNodes: {"titleNode":"navi"},
						onClick:dojo.hitch(this,"_navigate",i)
					});
					this._pageBtns.push(numBtn);
					this._naviBar.addChild(numBtn,beginIndex);
					beginIndex++;
				} else {
					if (isFirstLefttDot == false && i == this.currentPage - 3) {
						var numBtn = new dijit.form.Button({
							label:'...',
							baseClass:"",
							disabled:true
						});
						this._pageBtns.push(numBtn);
						this._naviBar.addChild(numBtn,beginIndex);
						beginIndex++;
						isFirstLefttDot = true;
					}
					if (isFirstRightDot == false && i > this.currentPage) {
						var numBtn = new dijit.form.Button({
							label:'...',
							baseClass:"",
							disabled:true
						});
						this._pageBtns.push(numBtn);
						this._naviBar.addChild(numBtn,beginIndex);
						beginIndex++;
						isFirstRightDot = true;
					}
				}
			}
			isShow = false;
		}
				/*var numBtn = new dijit.form.Button({
					label:i+1,
					baseClass:"",
					tooltip:"第"+(i+1)+"页",
					style:{border:"1px solid #A8AAE2",margin:"1px"},
					cssStateNodes: {"titleNode":"navi"},
					onClick:dojo.hitch(this,"_navigate",i+1)
				});
				this._pageBtns.push(numBtn);
				this._naviBar.addChild(numBtn,i+4);
			}
			this._naviBar.addChild(new dijit.form.Button({label:"...",baseClass:"",disabled:true}),btnsNum+3);
			var lasBtn = new dijit.form.Button({
				label:totalPage,
				baseClass:"",
				tooltip:"第"+(totalPage)+"页",
				style:{border:"1px solid #A8AAE2",margin:"1px"},
				cssStateNodes: {"titleNode":"navi"},
				onClick:dojo.hitch(this,"_navigate",totalPage)
			})
			this._pageBtns.push(lasBtn);
			this._naviBar.addChild(lasBtn,btnsNum+4);
			
			*/
		this.totalPage = totalPage;
		// 设置按钮的状态
		this._updateBtnStatus(this.currentPage);
		//this._pageLoaded = true;
	}
});

 

 

    重写了它的_onFetchComplete和_onFetchBegin方法。使之在分页开始和结束时,重置下角的分页按钮。

 

 

用matlab编程求矩阵的极大无关组,向量组极大无关组表示问题 已知向量组T:Eqn11.gif (3.16 KB, 下载次数: 1)2013-10-21 19:19 上传.(1) 求向量组T的秩,并判断向量组T的相关性;(2) 求T的极大线性无关组;(3) 将其余的向量用所求的极大线性无关组线性表示。程序:>> A=[1 1 3 2;-1 1 -1 3;5-2 8 9;-1 3 1 7]>> r=rank(A)>> A1=... 阅读详情

相关推荐

【Ablation Studies 理解】深度学习模型组件的对比实验/性能分析

Ablation Study 用于检测深度学习/机器学习模型中各部分构件对于整体的重要性。 可以理解为为:组件\tricks重要性测试、组件性能系统性分析、控制变量法、组件去除对比实验、性能敏感性测试、性能因子分析等 Ablation Studies 一些新颖的深度学习模型在论文中都会进行AblationStudy,这部分的主要意义在于系统性的移除模型中的各种组件/trick等因子或者是创新的...

TomRen 4588

用dojo中的grid控件生成的嵌套表

dojo的grid控件功能是比较强大的,也是我一开始想要学习它的原因。dojo中的grid其实就是table,很多时候,我们都需要展示有一对多关系的复杂数据。如:采购订单和订单中多种产品的信息;运输委托单和其中包含的多种货物的信息。这种情况下,使用grid的可展开、折叠的嵌套表来展示数据,可以兼顾信息量大和信息关系直观的要求。下图中显示的是两条运输委托单的概要信息,简单、清晰,使用户迅速了解当前运...

iteye_8778的博客 164

双传声器法测量吸声材料的吸声系数(公式推导与解释)

在双传声器法中,通过测量两个位置的声压 p1和 p2​,可以分离出入射波和反射波的声压分量。双传声器法一般在阻抗管中进行,阻抗管的一端为平面波声源,另一端放置待测材料。两个传声器放置在靠近材料的阻抗管内,用于测量管道内的声压。双传声器法是一种常用于测量材料吸声系数的实验方法,通过在管道内使用两个传声器测量声波的入射和反射,来计算出材料的吸声系数。当测试样品较少时,测试时,需要交换两个传声器的位置,目的是为了相位校准。

m0_57407372的博客 1875

dojo Grid用法总结

DataGrid、EnhancedGrid都有noDataMessage属性,可以设置这个属性来显示提示信息,例如: noDataMessage : "本单位当前无用户信息!" 要让这个属性起作用,store属性不能为null,而应该是size为0,即[] 假如,java中的ArrayList给grid提供数据,通过jsonrest,那么当没有数据时,应当return new Array

earthhour的专栏 5680

从芯片原厂到BSP工程师:技术转型与核心能力解析

嵌入式系统开发中,BSP(板级支持包)作为连接硬件与操作系统的关键层,其开发能力直接影响设备稳定性与性能。理解Linux内核架构(如内存管理、进程调度)和基础接口协议(I2C/SPI/USB)是BSP工程师的核心技能。在芯片验证与驱动开发场景中,多核异构系统调试与稳定性问题排查(如死机分析)展现了工程师的实战能力。随着物联网与智能设备发展,掌握从硬件适配到系统优化的全链路技术栈,成为职业发展的关键突破点。

weixin_36012152的博客 599

BALM2深度解析 | 港大MARS实验室如何用点簇革新激光BA?

本文深度解析了港大MARS实验室提出的BALM2方案如何通过点簇技术革新激光BA(Bundle Adjustment)处理。BALM2将点云数据聚合为点簇,显著提升计算效率,实测显示其计算耗时仅为传统方法的1/20。文章详细介绍了点簇的核心原理、二阶优化方法及与传统方法的性能对比,展示了其在激光SLAM领域的突破性应用。

weixin_29212867的博客 153

kndo grid:通过checkbox 实现多选和全选

在kendo grid 里要想通过checkbox 实现多选和权限,我们就要通过templeate 和input 标签对kendo grid 进行自定义 1. 在column 里面加入一列checkbox { title: " <input id='checkAll' type='checkbox' id='chkSelectAll' onclick='selectAllRow(th...

weixin_30512043的博客 961

告别手动输入!用Burp插件+ddddocr,5分钟搞定图片验证码自动识别

本文详细介绍了如何利用Burp插件和ddddocr开源库快速构建图片验证码自动识别系统,实现高效、零成本的验证码自动化解决方案。通过环境搭建、性能调优和Burp Suite深度集成,显著提升安全测试效率,特别适用于金融和电商系统的批量测试场景。

weixin_29099217的博客 202

用checkbox选中datagrid的所有行(或当前页所有行)

用checkbox选中datagrid的所有行(或当前页所有行)1.选中DATAGRID当前页所有行int startItem = this.datagrid.CurrentPageIndex * this.datagrid.PageSize ;int endItem = (this.datagrid.CurrentPageIndex + 1) * this.datagrid.PageSize

疯吻IT 1440

046篇:数据统计:分组、求和、平均值、最大最小值

本文介绍了在RPA中实现数据分组统计的方法。通过字典+循环组合,可以完成按单字段或多字段的分组聚合操作,包括求和、计数、求平均值及最大/最小值等。文章详细讲解了分组统计的原理,并提供了单级分组、多级分组的具体实现步骤,最后通过销售数据按月分组的实战案例,演示了如何从原始数据到生成汇总报表的完整流程。这些方法可以灵活应用于各类数据统计分析场景。

weixin_59649563的博客 214

Multisim14.0仿真应用设计(十六)74LS138译码器应用仿真

74LS138为3线-8线译码器。

zhusl6688的博客 2982

dojo grid遇到的问题 点击按钮“全选”'删除"无法实现

想写个网格 在下面有两个按钮 分别实现全选 与 全不选的功能 界面如下: 其中关键语句 :全选 删除 似乎根本没有实现   不知道什么原因。。。 完全的代码如下:

young00001的专栏 2017

【图像去噪】基于偏微分方程(PDE)实现图像去噪附matlab代码

在工程应用中,图像信息通过数字图像系统进行处理、存储和传输等加工变换时,由于不可避免地受到噪声干扰,使得原始图像信息产生偏差和失真,给图像的后续处理带来不便,进而影响人们对图像视觉特性的认知程度。因此,为了改善图像的质量效果,提高人们对图像视觉特性的认知度,对图像噪声进行有效去除,降低噪声对图像信息的干扰是很有必要的。近年来,基于偏微分方程( partial differential equation,PDE) ​的图像去噪方法在计算机视觉和图像处理等技术领域得到了广泛的重视,因为它在平滑噪声的同时,能够很

qq_59747472的博客 855

dojo中 的 grid 的改进:增加分页导航条

http://walle1027.iteye.com/blog/945607dojo.provide("navigationGrid"); dojo.require("dojox.grid.DataGrid"); dojo.require('dijit.Toolba

风中之枫 4199

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Dojo1.2延迟发布 性能值得期待

 dojo 1.2 已经延迟了3个礼拜,但是经过对1.2Nightly builds的测试,性能的确有很大的提升,尤其是Grid,无论在处理内存方面还是细节方面都比原来有了很大的改进下面是Dojo1.2的描述:API-compatible with Dojo 1.0 and 1.1, Dojo 1.2 will feature: major improvements to the

我的博客 778

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Dojo 1.7 Release Notes翻译完成,包含若干重大更新

Dojo 1.7作为变化重大的一个版本,已经Release近两个月,而现在已经放出了1.7.2的小版本更新,包括了一些小的fix。让人难以理解的是即使Dojo 1.7已经Release这么久,但是其release notes至今仍然是draft状态。。这也导致了迟迟不能对它进行翻译。看来Dojo社区的那帮老大完全是技术狂,对于文档和社区其他用户的关注还远远不够啊,需要改进。。尽管Release n

Dojo中文博客 7368

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

扩展Dojo 1.0——完整版

以前贴过扩展Dojo的几个Wedgets,今天把完整的代码上传上来。主要Features包括: [list] [*]一个简单的不能再简单的Grid,支持列排序,但是不支持调整列宽。 [*]一个简单的不能再简单的分页Widget,可以和Grid结合使用 [*]美化了原版dojo floating pane. [*]支持Resizing的模式Dialog [*]Tree Widget,以及...

风之力——Essential Java 224

Dojo 1.2 Candidate 发布

在推迟了一个月之后,dojo 1.2的Candidate版本终于发布了, http://www.dojotoolkit.org/2008/09/19/dojo-1-2-proper-candidate http://download.dojotoolkit.org/release-1.2.0rc1/ Dojo  1.2 的变化向后兼容Dojo V1.2添加了很多的新

我的博客 3357

Dojo EnhancedGrid新功能评介(1)——Pagination

Dojo1.6为 dojox.grid.EnhancedGrid 以插件的形式增添了一些新的功能。在介绍它们之前,先提一下这个 EnhancedGrid 的来龙去脉,如果不感兴趣,请直接无视… 顾名思义,EnhancedGrid 就是 Grid 的加强版,从 Dojo1.4 开始就有了。它的存在是由于原先的 Da...

weixin_30664615的博客 87

关于Dojo的Grid

Dojo 0.9与以前发布的所有其它版本都不兼容。关于这一结论的说明可以参考Doji官方网站上的文档:《Dojo Porting Guide: 0.4.x to 0.9》,下面是2007-10-3浏览该网站相关内容时所作的屏幕截图(为了记述更清晰对截图做了一些标识,下同)。  Dojo 0.4中的一些重要的特征,在Dojo 0.9中没有实现。为此,Dojo官方网站上给出了一个列,表

专栏 2402

dojo grid 组件

dojo的grid组件,其功能还是很强大的,我主要用到两种方式: Test dojox.grid.DataGrid Basic Editing @import "../../../dojo/resources/dojo.css"; @import "../r

学习 2399

dojo grid 分页

dojo很强大,也很方便,但是缺少文档,只能看源代码,也挺好的,就是费时间。。。 网上找了一段代码(找不到原出处了,不好意思),也看了dojo自带的demo,放一段可以执行的页面代码这里。把ip换成自己架设的js服务器(esi的CDN貌似有点问题)即可 1 <!DOCTYPE html> 2 <html> 3 <head> ...

diaoxian3971的博客 266

解决Dojo Grid 在TabContainer中的不显示或者刷新错误问题

修改TabContainer.js文件,在dijit.layout.TabController中添加函数onButtonClick,大功告成!当然这个方法有点代价有点高,如果只是为了单独解决Grid问题,可以直接each一下Grid,修改一下就可以。dojo.declare("dijit.layout.TabController", dijit.layout.StackC

我的博客 2340

Dojo Grid的基本使用 和 表头 出现混乱问题

Grid的基本使用// Grid表头定义var structure = [{        cells: [            [             {name: "タイトル", field:"name1", width: "610px", styles: text-align: left;height:18px;},             {name: "内容", field

实践那回事儿 2623

dojo dataGrid 异步保存数据

dojo.require("dojox.grid.EnhancedGrid"); dojo.require("dojox.grid.enhanced.plugins.IndirectSelection"); dojo.require("dojo.data.It

3253

dojo1.1.0学习总结--Gird绑定JSON数据案例

 前台页面部分:         gird绑定JSON数据案例                    @import "js/dojo-release-1.1.0/dojox/grid/_grid/Grid.css";        @import "js/dojo-release-1.1.0/dojo/dijit/theme

☆ 海上飞洪 ☆ 2879
上一篇: 大量数据时,SQL语句的书写区别
下一篇: 管理系统登陆
sharp_yt
博客等级 码龄15年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值