java extjs4 分页_extjs学习笔记(四)带分页的grid

很多时候,我们需要显示在grid中的数据不是短短的几条或者几十条,而是成千上万条。如果让大量的数据一股脑全都显示在一个页面中,可以想象会造成什么样的用户体验。因此,现在几乎所有的grid控件都会支持分页功能。extjs也不例外,它对分页也提供了强大而方便的支持,使得我们在分页处理上可以得心应手。

在extjs中,类Ext.PagingToolbar封装了关于分页的操作,该类从Toolbar继承而来,单从名字上看,我们也猜得出这是一个能够处理分页的工具栏。好吧,那我们就来看看如何构造这样一个工具栏吧。PagingToolbar类的构造函数需要一个json对象来进行配置,在js中,使用json对象来提供所需参数非常方便,这样使得我们可以只填写感兴趣的参数,并且不必关心参数的顺序。我们的分页工具栏常用的配置参数包括:

pageSize:每页显示的记录数,默认是20。

store:这个和grid里边的store参数是一样的,因为分页也需要和数据打交道,所以需要这个参数。

displayMsg:显示的分页状态信息,例如“第{0}-第{1}条,一共{2}条",注意一定要有大括号括起来的0,1,2,分别代表当前页的开始,结束,还有全部的记录数,其它的字自己随便写吧,只要读起来通顺就可以了,该信息会显示在分页工具栏的右侧。

displayInfo:是否显示displayMsg,默认是不显示。

emptyMsg:没有记录时显示的文本。

items:要在工具栏上显示的项,我们在构造之后再来看一下都可以有哪些项。

好了,现在可以构造我们的分页工具栏了,不过因为我们的参数里边需要一个Store类的对象,所以我们先来构造它:

1

24a924a57ba6b3f2b51fc9edb7ea4186.png

9310e85a14af99de4811ff4c77f1f911.pngvarstore=newExt.data.JsonStore(222530190136c9c4cfd237cc0d5cff99.png{21408c5260b2f05e450dee929db9be5f7.png        root:'topics',31408c5260b2f05e450dee929db9be5f7.png        totalProperty:'totalCount',41408c5260b2f05e450dee929db9be5f7.png        idProperty:'threadid',51408c5260b2f05e450dee929db9be5f7.png        remoteSort:true,61408c5260b2f05e450dee929db9be5f7.png71408c5260b2f05e450dee929db9be5f7.png        fields: [81408c5260b2f05e450dee929db9be5f7.png'title','forumtitle','forumid','author',9715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png222530190136c9c4cfd237cc0d5cff99.png{ name:'replycount', type:'int'},10715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png222530190136c9c4cfd237cc0d5cff99.png{ name:'lastpost', mapping:'lastpost', type:'date', dateFormat:'timestamp'},111408c5260b2f05e450dee929db9be5f7.png'lastposter','excerpt'121408c5260b2f05e450dee929db9be5f7.png        ],131408c5260b2f05e450dee929db9be5f7.png141408c5260b2f05e450dee929db9be5f7.png//因为跨域,所以使用ScriptTagProxy,在同一个域里边用HttpProxy15715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngproxy:newExt.data.ScriptTagProxy(222530190136c9c4cfd237cc0d5cff99.png{161408c5260b2f05e450dee929db9be5f7.png            url:'http://extjs.com/forum/topics-browse-remote.php'175bcb1807ee3e00d2b3c225f0b3f5c751.png        })18f466905a3bcb5dcef110eab799825254.png    });    这一次,我们使用了JsonStore类来构造所需要的Store对象,顾名思义,这是用来转化son格式的数据的。另外我们是从外部服务器来获取数据,所以代码相对于原来从数组里边获得数据要复杂一些,我们来看看用到的那些参数的意义:

root:包含数据行集合的属性名字。

totalProperty:表示数据集中全部记录数的属性名字,只有在分页的时候才需要。

idProperty:数据行中用来作为标识的属性的名字。

remoteSort:排序的时候是否通过proxy获得新的数据,默认是false。

fields:上一个系列里边提到过。这里多了一个mapping,它是将数据里边的名字映射成封装后的Record字段的名字,名字相同的时候,可以忽略。

proxy:数据的来源。在这里,我们只需要知道我们的数据是从url指明的地址获得的,因为这个地址是跨域的,所以使用ScriptTagProxy。需要注意的是,从服务器返回的数据必须具有如下的格式:

{"totalCount":10000,//对应totalProperty属性的值"topics":[//对应root户型的值//这里是json对象的集合,每一个对象的属性//需要和fields里边name属性的值对应//观察url返回给我们的数据可以更清楚的看明白这一点]

}    接下来就是构造我们的分页工具栏了:

1

24a924a57ba6b3f2b51fc9edb7ea4186.png

9310e85a14af99de4811ff4c77f1f911.pngvarpagingToolbar=newExt.PagingToolbar(222530190136c9c4cfd237cc0d5cff99.png{21408c5260b2f05e450dee929db9be5f7.png        pageSize:25,31408c5260b2f05e450dee929db9be5f7.png        store: store,41408c5260b2f05e450dee929db9be5f7.png        displayInfo:true,51408c5260b2f05e450dee929db9be5f7.png        displayMsg:'Displaying topics {0} - {1} of {2}',61408c5260b2f05e450dee929db9be5f7.png        emptyMsg:"一篇文章也没有",71408c5260b2f05e450dee929db9be5f7.png        items: [8715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png'-',222530190136c9c4cfd237cc0d5cff99.png{91408c5260b2f05e450dee929db9be5f7.png                    pressed:true,101408c5260b2f05e450dee929db9be5f7.png                    enableToggle:true,111408c5260b2f05e450dee929db9be5f7.png                    text:'Show Preview',121408c5260b2f05e450dee929db9be5f7.png                    cls:'x-btn-text-icon details',13715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png                    toggleHandler:function(btn, pressed)222530190136c9c4cfd237cc0d5cff99.png{141408c5260b2f05e450dee929db9be5f7.pngvarview=grid.getView();151408c5260b2f05e450dee929db9be5f7.png                        view.showPreview=pressed;161408c5260b2f05e450dee929db9be5f7.png                        view.refresh();175bcb1807ee3e00d2b3c225f0b3f5c751.png                    }185bcb1807ee3e00d2b3c225f0b3f5c751.png}]19f466905a3bcb5dcef110eab799825254.png    });    (不知道vs2008的格式化功能为什么把第18行的括号给放在最靠左边的位置,望哪位朋友知道解决的方法告知一下。)

items是工具栏上项的集合,默认的类型是按钮。我们这里只用到了两项,“-”代表分隔符,第二项就是一个button,我们来看看其中每个属性都表示什么:

pressed:表示按钮在开始的时候是否被按下,只有enableToggle为真的时候才有用。

enableToggle:指示button是否能处于被按下的状态。

text:按钮上显示的文本。

cls:按钮的css类。

toggleHander:设置enableToggle为true时点击按钮时的事件处理函数。

是时候把分页工具栏和grid组合在一起了,这次我们的grid没有使用ColumnModel而是使用columns属性,同时我们使用了viewConfig来对用户界面进行配置,看下完整的代码吧:

1

731655954c7be9d8835ece551b5385f8.png///224a924a57ba6b3f2b51fc9edb7ea4186.png

9310e85a14af99de4811ff4c77f1f911.png/**//*31408c5260b2f05e450dee929db9be5f7.png*作者:大笨41408c5260b2f05e450dee929db9be5f7.png*日期:2009-10-1351408c5260b2f05e450dee929db9be5f7.png*版本:1.067f466905a3bcb5dcef110eab799825254.png*/8731655954c7be9d8835ece551b5385f8.pngExt.BLANK_IMAGE_URL='../extjs/resources/images/default/s.gif';924a924a57ba6b3f2b51fc9edb7ea4186.png

9310e85a14af99de4811ff4c77f1f911.pngExt.onReady(function()222530190136c9c4cfd237cc0d5cff99.png{101408c5260b2f05e450dee929db9be5f7.png//构造store11715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngvarstore=newExt.data.JsonStore(222530190136c9c4cfd237cc0d5cff99.png{121408c5260b2f05e450dee929db9be5f7.png        root:'topics',131408c5260b2f05e450dee929db9be5f7.png        totalProperty:'totalCount',141408c5260b2f05e450dee929db9be5f7.png        idProperty:'threadid',151408c5260b2f05e450dee929db9be5f7.png        remoteSort:true,161408c5260b2f05e450dee929db9be5f7.png171408c5260b2f05e450dee929db9be5f7.png        fields: [181408c5260b2f05e450dee929db9be5f7.png'title','forumtitle','forumid','author',19715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png222530190136c9c4cfd237cc0d5cff99.png{ name:'replycount', type:'int'},20715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png222530190136c9c4cfd237cc0d5cff99.png{ name:'lastpost', mapping:'lastpost', type:'date', dateFormat:'timestamp'},211408c5260b2f05e450dee929db9be5f7.png'lastposter','excerpt'221408c5260b2f05e450dee929db9be5f7.png        ],231408c5260b2f05e450dee929db9be5f7.png241408c5260b2f05e450dee929db9be5f7.png//因为跨域,所以使用ScriptTagProxy,在同一个域里边用HttpProxy25715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngproxy:newExt.data.ScriptTagProxy(222530190136c9c4cfd237cc0d5cff99.png{261408c5260b2f05e450dee929db9be5f7.png            url:'http://extjs.com/forum/topics-browse-remote.php'275bcb1807ee3e00d2b3c225f0b3f5c751.png        })285bcb1807ee3e00d2b3c225f0b3f5c751.png    });291408c5260b2f05e450dee929db9be5f7.png301408c5260b2f05e450dee929db9be5f7.png    store.setDefaultSort("lastpost","DESC");//设置默认的排序列和方向311408c5260b2f05e450dee929db9be5f7.png321408c5260b2f05e450dee929db9be5f7.png//构造带分页功能的工具栏33715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngvarpagingToolbar=newExt.PagingToolbar(222530190136c9c4cfd237cc0d5cff99.png{341408c5260b2f05e450dee929db9be5f7.png        pageSize:25,351408c5260b2f05e450dee929db9be5f7.png        store: store,361408c5260b2f05e450dee929db9be5f7.png        displayInfo:true,371408c5260b2f05e450dee929db9be5f7.png        displayMsg:'第{0}-第{1}条,一共{2}条',381408c5260b2f05e450dee929db9be5f7.png        emptyMsg:"No topics to display",391408c5260b2f05e450dee929db9be5f7.png        items: [40715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png'-',222530190136c9c4cfd237cc0d5cff99.png{411408c5260b2f05e450dee929db9be5f7.png                    pressed:true,421408c5260b2f05e450dee929db9be5f7.png                    enableToggle:true,431408c5260b2f05e450dee929db9be5f7.png                    text:'预览',441408c5260b2f05e450dee929db9be5f7.png                    cls:'x-btn-text-icon details',45715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png                    toggleHandler:function(btn, pressed)222530190136c9c4cfd237cc0d5cff99.png{461408c5260b2f05e450dee929db9be5f7.pngvarview=grid.getView();471408c5260b2f05e450dee929db9be5f7.png                        view.showPreview=pressed;481408c5260b2f05e450dee929db9be5f7.png                        view.refresh();495bcb1807ee3e00d2b3c225f0b3f5c751.png                    }505bcb1807ee3e00d2b3c225f0b3f5c751.png}]515bcb1807ee3e00d2b3c225f0b3f5c751.png    });521408c5260b2f05e450dee929db9be5f7.png531408c5260b2f05e450dee929db9be5f7.png//构造带有分页工具栏的grid54715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngvargrid=newExt.grid.GridPanel(222530190136c9c4cfd237cc0d5cff99.png{551408c5260b2f05e450dee929db9be5f7.png        renderTo:"grid",561408c5260b2f05e450dee929db9be5f7.png        width:700,571408c5260b2f05e450dee929db9be5f7.png        height:500,581408c5260b2f05e450dee929db9be5f7.png        title:'带分页功能的grid',591408c5260b2f05e450dee929db9be5f7.png        store: store,601408c5260b2f05e450dee929db9be5f7.png        trackMouseOver:false,611408c5260b2f05e450dee929db9be5f7.png        disableSelection:true,621408c5260b2f05e450dee929db9be5f7.png        loadMask:true,631408c5260b2f05e450dee929db9be5f7.png641408c5260b2f05e450dee929db9be5f7.png//grid的列65715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngcolumns: [222530190136c9c4cfd237cc0d5cff99.png{661408c5260b2f05e450dee929db9be5f7.png            id:'topic',671408c5260b2f05e450dee929db9be5f7.pngheader:"主题",681408c5260b2f05e450dee929db9be5f7.png            dataIndex:'title',691408c5260b2f05e450dee929db9be5f7.png            width:420,701408c5260b2f05e450dee929db9be5f7.png            renderer: renderTopic,711408c5260b2f05e450dee929db9be5f7.png            sortable:true72715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png        },222530190136c9c4cfd237cc0d5cff99.png{731408c5260b2f05e450dee929db9be5f7.png            header:"作者",741408c5260b2f05e450dee929db9be5f7.png            dataIndex:'author',751408c5260b2f05e450dee929db9be5f7.png            width:100,761408c5260b2f05e450dee929db9be5f7.png            hidden:true,771408c5260b2f05e450dee929db9be5f7.png            sortable:true78715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png        },222530190136c9c4cfd237cc0d5cff99.png{791408c5260b2f05e450dee929db9be5f7.png            header:"回复数",801408c5260b2f05e450dee929db9be5f7.png            dataIndex:'replycount',811408c5260b2f05e450dee929db9be5f7.png            width:70,821408c5260b2f05e450dee929db9be5f7.png            align:'right',831408c5260b2f05e450dee929db9be5f7.png            sortable:true84715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png        },222530190136c9c4cfd237cc0d5cff99.png{851408c5260b2f05e450dee929db9be5f7.png            id:'last',861408c5260b2f05e450dee929db9be5f7.png            header:"最后回复",871408c5260b2f05e450dee929db9be5f7.png            dataIndex:'lastpost',881408c5260b2f05e450dee929db9be5f7.png            width:150,891408c5260b2f05e450dee929db9be5f7.png            renderer: renderLast,901408c5260b2f05e450dee929db9be5f7.png            sortable:true915bcb1807ee3e00d2b3c225f0b3f5c751.png}],921408c5260b2f05e450dee929db9be5f7.png931408c5260b2f05e450dee929db9be5f7.png//定制用户界面94715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngviewConfig:222530190136c9c4cfd237cc0d5cff99.png{951408c5260b2f05e450dee929db9be5f7.png                forceFit:true,961408c5260b2f05e450dee929db9be5f7.png                enableRowBody:true,971408c5260b2f05e450dee929db9be5f7.png                showPreview:true,98715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.png                getRowClass:function(record, rowIndex, p, store)222530190136c9c4cfd237cc0d5cff99.png{99715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngif(this.showPreview)222530190136c9c4cfd237cc0d5cff99.png{1001408c5260b2f05e450dee929db9be5f7.png                        p.body='

'+record.data.excerpt+'

';101 1408c5260b2f05e450dee929db9be5f7.pngreturn'x-grid3-row-expanded';102 5bcb1807ee3e00d2b3c225f0b3f5c751.png                    }103 1408c5260b2f05e450dee929db9be5f7.pngreturn'x-grid3-row-collapsed';104 5bcb1807ee3e00d2b3c225f0b3f5c751.png                }105 5bcb1807ee3e00d2b3c225f0b3f5c751.png            },106 1408c5260b2f05e450dee929db9be5f7.png107 1408c5260b2f05e450dee929db9be5f7.png//在顶部的分页工具栏108 1408c5260b2f05e450dee929db9be5f7.png//tbar: pagingToolbar,109 1408c5260b2f05e450dee929db9be5f7.png110 1408c5260b2f05e450dee929db9be5f7.png//在底部的分页工具栏111 1408c5260b2f05e450dee929db9be5f7.pngbbar: pagingToolbar112 5bcb1807ee3e00d2b3c225f0b3f5c751.png        });113 1408c5260b2f05e450dee929db9be5f7.png114 1408c5260b2f05e450dee929db9be5f7.png//加载数据115 715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngstore.load(222530190136c9c4cfd237cc0d5cff99.png{ params:222530190136c9c4cfd237cc0d5cff99.png{ start:0, limit:25}});1161408c5260b2f05e450dee929db9be5f7.png1171408c5260b2f05e450dee929db9be5f7.png//主题列的renderer函数118715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngfunctionrenderTopic(value, p, record)222530190136c9c4cfd237cc0d5cff99.png{1191408c5260b2f05e450dee929db9be5f7.pngreturnString.format(1201408c5260b2f05e450dee929db9be5f7.png'{0}{1} Forum',1211408c5260b2f05e450dee929db9be5f7.png                value, record.data.forumtitle, record.id, record.data.forumid);1225bcb1807ee3e00d2b3c225f0b3f5c751.png        }1231408c5260b2f05e450dee929db9be5f7.png//最后回复列的renderer函数124715f2d05503b99d41f3b6ba2cdccc84d.png

e083dfde5a91f50979fe8979b4012b9d.pngfunctionrenderLast(value, p, r)222530190136c9c4cfd237cc0d5cff99.png{1251408c5260b2f05e450dee929db9be5f7.pngreturnString.format('{0}
by {1}', value.dateFormat('M j, Y, g:i a'), r.data['lastposter']);1265bcb1807ee3e00d2b3c225f0b3f5c751.png        }127f466905a3bcb5dcef110eab799825254.png    })    运行下看看效果,我们可以看到在获取数据的时候,页面被动画遮盖住,如图:

0142abbb6327ff5282080631a261136f.png

当数据加载完成,我们看到数据在grid中分页显示,并且按照最后发表列降序排列,其中作者列被隐藏:

cfd3dadf1bb5f4452f3ee4a4f340edb3.png

当点击列名进行排序时,会从服务器上重新加载新的数据,点击向右的箭头,可以翻页,还可以点点“预览”按钮看看效果。虽然这次的代码相对最简单的grid多了不少,但效果也cool了不少。我们从头开始把代码理一下吧:

第8行使用了图片占位符,它指向的图片是一张空图片。在extjs的库文件中,根据需要会把这个图片占位符替换成另一张图片,在我们的例子中,如果去掉这一行,影响不会太大,只是标题栏中“最后回复”旁边向下的小箭头会不见了。我们还是养成把这一行写上的习惯吧。

11-28行构造了一个Store类的对象,这个没什么好说的了。

第30行设置lastpost列为默认排序的列,并且是按降序排列,注意“DESC"必须是大写,升序是“ASC”。

33-51行构造带分页的工具栏,前边都已经说过了。

54-112行构造带有分页功能的grid。

其中第60行指示鼠标在行上悬浮时行不会高亮显示。

61行指示用户不能对grid进行选择。

62行指示在加载数据的时候遮盖住页面,我们可以在截图上看到效果,不过还是推荐自己运行看下效果,毕竟这里显示的是动画。当数据加载完毕之后遮盖效果消失。

94-105行设置用户界面,我们看看每个参数的意义:

forceFit:是否强制列调整宽度使得不出现水平滚动条,默认是false。

enableRowBody:为true的时候允许每行增加一个tr元素用来扩展数据行。

showPreview:自定义的bool类型的属性,用来在代码中控制是否显示预览。

getRowClass:这是一个方法,用来改写行的css样式,它有四个参数,第一个是代表该行数据的Record对象,第二个是行的索引,第三个就是enableRowBody设置true时传递进来的

参数,可以通过该参数的body属性扩展行数据。该方法应当返回一个css类名。我们的例子中,根据showPreview的值来动态显示文章的摘要信息。

111行将分页工具栏显示在grid底部,如果想显示在顶部可以用tbar来代替bbar。

115行向服务器发出请求获取数据,extjs会以post方式将params中的参数发送给服务器,其中start指明从地几条数据开始,limit则表示每页显示多少数据。

118到126是两个renderer函数,在上一个系列中已经解释过用法了。

最后要指出的是,分页的功能其实还是在服务器端完成的。当在客户端进行翻页的时候,会和115行一样提交参数,我们需要在服务器端根据传递过来的star和limit的值来计算出应当返回的数据并且按照正确的格式来发送给客户端。至于服务器端如何获得客户端传递过来的参数和如何发送数据给客户端,可参阅本系列的第一节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值