在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方法。使之在分页开始和结束时,重置下角的分页按钮。
分享到:
相关推荐
2. **合并行Grid demo**: 这个示例展示了如何在Grid中合并单元格,这在显示层次结构信息或者组织复杂数据时特别有用。通过合并行,可以创建具有头部和子头部的表格结构,使数据更易于理解和分析。 3. **数据过滤...
Dojo Grid是一个强大的JavaScript组件,用于在Web应用中展示和操作数据表格。它属于Dojo Toolkit的一部分,一个广泛使用的开源JavaScript库,提供了丰富的UI组件和工具,用于开发高性能、跨平台的富互联网应用(RIA...
dojo扩展grid(带刷新函数复选框等功能).js
使用CDN上的DOjo非常快捷,用户只需添加一个script标签到HTML文件中就可以使用DOjo。 DOjo的基本使用 DOjo是一个JavaScript库,提供了许多有用的功能,如DOM操作、事件处理、AJAX请求等。DOjo的使用需要一个网络...
Dojo Grid是一个强大的数据网格组件,它是Dojo Toolkit的一部分,用于在Web应用程序中展示和管理大量结构化数据。Dojo Grid提供了丰富的功能,包括排序、筛选、分页、编辑和自定义格式化,使得用户可以方便地操作和...
DOJO的核心目标是解决长期以来在开发DHTML应用过程中遇到的历史问题,特别是跨浏览器兼容性问题。 #### 二、DOJO的功能特点 ##### 1. 动态网页支持 - **增强网页动态能力**:利用DOJO提供的组件,可以显著提高Web...
此外,Dojo还提供了一套强大的DOM操作API,如dojo.create、dojo.destroy和dojo.style,使得在JavaScript中操作DOM变得简单易行。 在数据交互方面,Dojo的dojo.xhr系列函数(如dojo.xhrGet、xhrPost)实现了与服务器...
在给定的“dojo 在线操作表格”主题中,Dojo的Grid组件是核心知识点,它提供了强大的数据展示和管理功能,支持在线的增删改查操作。 Dojo Grid允许用户在网页上直接操作表格数据,提供了丰富的功能,包括但不限于:...
手册中列举了一些常用的Dojo包,如dojo.io用于不同类型的IO传输,dojo.dnd提供拖放功能的API,dojo.string提供了字符串处理方法,dojo.date帮助解析和操作日期,dojo.event处理事件驱动和AOP开发,dojo.back管理撤销...
3. **dojo/ready**:这个模块用于确保DOM加载完成后再执行指定的函数,它是Dojo中的一个实用工具,常用于页面初始化。 4. **dojo/store**:这是一个数据存储抽象层,提供了一种统一的方式来访问和操作数据,无论...
dojo中文文档dojo中文文档
DOJO中文手册是针对JavaScript库Dojo的详细指南,源自中国的本地化版本,旨在帮助开发者理解和使用这个强大的工具包。Dojo是一个开源的DHTML工具集,由nWidgets、Burstlib和f(m)等多个项目的合并发展而来,因此被...
Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...
同时,1.8版本改进了Dojo的DOM操作和事件处理,增强了对移动设备的支持,并提供了更丰富的UI组件。 AMD模块系统允许开发者按需加载依赖,减少了整体页面的加载时间。在Dojo 1.8的chm文档中,你可以找到如何使用...
在Dojo框架中,有几个核心概念和关键组件是学习的重点: 1. **模块系统(AMD,Asynchronous Module Definition)**:Dojo是AMD规范的先驱,它允许异步加载和组织代码,使得大型项目的结构更加清晰。通过`require`和...
Dojo学习笔记-- dojo.event & dojo.event.topic & dojo.event.browser Dojo学习笔记--DateTextbox Dojo学习笔记--Dojo的基础对象和方法 Dojo学习笔记--FisheyeList鱼眼效果 Dojo学习笔记--TabContainer Dojo...
一个全新的grid组件。轻量化,模块化,易于扩展,基于dojo。 标签:dgrid
Dojo 是一个基于 JavaScript 的开源工具包,旨在简化DHTML应用程序的开发,尤其注重解决跨浏览器的兼容性问题。...通过其模块化设计和对跨浏览器兼容性的关注,Dojo 成为了现代Web开发中不可或缺的一部分。
例如,Dojo的Grid组件可以轻松创建动态数据展示表格,而Dialog组件则用于创建弹出对话框。 数据绑定是Dojo中连接UI与数据模型的机制,允许开发者在视图和模型之间建立双向绑定。当模型数据改变时,视图会自动更新,...