按照国际惯例,先上一个效果图:
效果图1
效果图2
设计思路
1.将一个可以设置每页条数的控件放到PagingToolbar里面去,当改变了每页显示条数时,通知PagingToolbar重新取数据显示;当PagingToolbar中的每页显示条数发生变化时(可能由其它的分页插件引起),更新显示自身数据(每页显示条数)。
2.可以设置每页条数的控件,一般有以下几种,下拉框,滑块控件,文本框等,本文实现了下拉框(支持填写数字),滑块。
3. 设置每页条数的控件可以加到PagingToolbar中的任意位置,如图
代码说明:
1.编写Ext中的插件,Javascript代码格式如下:
3 Ext.ui.plugins.ComboPageSize = function (config) {
4 Ext.apply( this , config);
5 };
6
7 Ext.extend(Ext.ui.plugins.ComboPageSize, Ext.util.Observable, {
8 // 自己编写的代码,重点是init: function(pagingToolbar) {...}这段代码
10})
2.将插件加到指定的位置,如上面的图所画,在实际中使用pagingToolbar.insert(index, control)便可以达到目的,这里还有一个方法pagingToolbar.add(control)是直接将控件加到pagingToolbar的最后(如上图黑线所示),这样的话,我们可以为插件定义一个属性
index: 0, //在items中的位置
3.当取到用户设定的每页条数时,这时通知pagingToolbar,主要工作是设置pagingToolbar.pageSize,然后重新计算出start,分页请求取数据的开始数据序号
2 var gp = pagingToolbar.findParentBy(
3 function (ct, cmp) { return (ct instanceof Ext.grid.GridPanel) ? true : false ; }
4 );
5 var sm = gp.getSelectionModel();
6 if (#ff0000 != sm && sm.hasSelection()) {
7 if (sm instanceof Ext.grid.RowSelectionModel) {
8 rowIndex = gp.store.indexOf(sm.getSelected());
9 } else if (sm instanceof Ext.grid.CellSelectionModel) {
10 rowIndex = sm.getSelectedCell()[ 0 ];
11 }
12 }
13 rowIndex += pagingToolbar.cursor;
14 pagingToolbar.doLoad(Math.floor(rowIndex / pagingToolbar.pageSize) * pagingToolbar.pageSize);
注意:
在某种特定情况下,pagingToolbar.cursor会出现不存在的情况(在测试中发现在comobox中手动输入一个数字会出现这种情况),所以用rowIndex比较保险,假如只是让用户选择显示条数,代码只用
pagingToolbar.doLoad(Math.floor(pagingToolbar.cursor/ pagingToolbar.pageSize) * pagingToolbar.pageSize)就可以解决了。
4,当插件发现 pagingToolbar的每页显示数发生变化,对自身的显示信息进行更新,方法是注册侦听pagingToolbar中的change
下拉框插件的完整代码:
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
2
3 Ext.ui.plugins.ComboPageSize = function(config) {
4 Ext.apply( this , config);
5 };
6
7 Ext.extend(Ext.ui.plugins.ComboPageSize, Ext.util.Observable, {
8
9 pageSizes: [ 5 , 10 , 15 , 20 , 25 , 30 , 50 , 75 , 100 , 200 , 300 , 500 ],
10 prefixText: ' Showing ' ,
11 postfixText: ' records per page. ' ,
12 addToItem: true , // true添加到items中去,配合index;false则直接添加到最后
13 index: 0 , // 在items中的位置
14 init: function(pagingToolbar) {
15 var ps = this .pageSizes;
16 var combo = new Ext.form.ComboBox({
17 typeAhead: true ,
18 triggerAction: ' all ' ,
19 lazyRender: true ,
20 mode: ' local ' ,
21 width: 45 ,
22 store: ps,
23 enableKeyEvents: true ,
24 editable: true ,
25 loadPages: function() {
26 var rowIndex = 0 ;
27 var gp = pagingToolbar.findParentBy(
28 function(ct, cmp) { return (ct instanceof Ext.grid.GridPanel) ? true : false ; }
29 );
30 var sm = gp.getSelectionModel();
31 if (undefined != sm && sm.hasSelection()) {
32 if (sm instanceof Ext.grid.RowSelectionModel) {
33 rowIndex = gp.store.indexOf(sm.getSelected());
34 } else if (sm instanceof Ext.grid.CellSelectionModel) {
35 rowIndex = sm.getSelectedCell()[ 0 ];
36 }
37 }
38 rowIndex += pagingToolbar.cursor;
39 pagingToolbar.doLoad(Math.floor(rowIndex / pagingToolbar.pageSize) * pagingToolbar.pageSize);
40 },
41 listeners: {
42 select: function(c, r, i) {
43 pagingToolbar.pageSize = ps[i];
44 this .loadPages();
45 },
46 blur: function() {
47 var pagesizeTemp = Number( this .getValue());
48 if (isNaN(pagesizeTemp)) {
49 this .setValue(pagingToolbar.pageSize);
50 return ;
51 }
52 pagingToolbar.pageSize = Number( this .getValue());
53 this .loadPages();
54 }
55 }
56 });
57 if ( this .addToItem) {
58 var inputIndex = this .index;
59 if (inputIndex > pagingToolbar.items.length) inputIndex = pagingToolbar.items.length;
60 pagingToolbar.insert( ++ inputIndex, ' - ' );
61 pagingToolbar.insert( ++ inputIndex, this .prefixText);
62 pagingToolbar.insert( ++ inputIndex, combo);
63 pagingToolbar.insert( ++ inputIndex, this .postfixText);
64 }
65 else {
66 pagingToolbar.add( ' - ' );
67 pagingToolbar.add( this .prefixText);
68 pagingToolbar.add(combo);
69 pagingToolbar.add( this .postfixText);
70 }
71 pagingToolbar.on({
72 beforedestroy: function() {
73 combo.destroy();
74 },
75 change: function() {
76 combo.setValue(pagingToolbar.pageSize);
77
78 }
79 });
80
81 }
82 })
滑块插件的完整代码:
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
2
3 Ext.ui.plugins.SliderPageSize = function (config) {
4 Ext.apply( this , config);
5 };
6
7 Ext.extend(Ext.ui.plugins.SliderPageSize, Ext.util.Observable, {
8 pageSizes: [ 5 , 10 , 15 , 20 , 25 , 30 , 50 , 75 , 100 , 200 , 300 , 500 ],
9 tipText: ' 每页{0}条 ' ,
10 addToItem: true , // true添加到items中去,配合index;false则直接添加到最后
11 index: 10 , // 在items中的位置
12 init: function (pagingToolbar) {
13
14 var ps = this .pageSizes;
15 var sv = 0 ;
16 Ext.each( this .pageSizes, function (ps, i) {
17 if (ps == pagingToolbar.pageSize) {
18 sv = i;
19 return ;
20 }
21 });
22 var tt = this .tipText;
23 var slider = new Ext.Slider({
24 width: 115 ,
25 value: sv,
26 minValue: 0 ,
27 maxValue: ps.length - 1 ,
28 plugins: new Ext.ux.SliderTip({
29 getText: function (slider) { return String.format(tt, ps[slider.value]); }
30 }),
31 listeners: {
32 changecomplete: function (s, v) {
33 pagingToolbar.pageSize = ps[v];
34 var rowIndex = 0 ;
35 var gp = pagingToolbar.findParentBy(
36 function (ct, cmp) { return (ct instanceof Ext.grid.GridPanel) ? true : false ; }
37 );
38 var sm = gp.getSelectionModel();
39 if (undefined != sm && sm.hasSelection()) {
40 if (sm instanceof Ext.grid.RowSelectionModel) {
41 rowIndex = gp.store.indexOf(sm.getSelected());
42 } else if (sm instanceof Ext.grid.CellSelectionModel) {
43 rowIndex = sm.getSelectedCell()[ 0 ];
44 }
45 }
46 rowIndex += pagingToolbar.cursor;
47 pagingToolbar.doLoad(Math.floor(rowIndex / pagingToolbar.pageSize) * pagingToolbar.pageSize);
48 }
49 }
50 });
51 //
52 if ( this .addToItem) {
53 var inputIndex = this .index;
54 if (inputIndex > pagingToolbar.items.length) inputIndex = pagingToolbar.items.length;
55 pagingToolbar.insert( ++ inputIndex, ' - ' );
56 pagingToolbar.insert( ++ inputIndex, slider);
57 }
58 else {
59 pagingToolbar.add( ' - ' );
60 pagingToolbar.add(slider);
61 }
62 //
63 pagingToolbar.on({
64 beforedestroy: function () {
65 slider.destroy();
66 },
67 change: function () {
68 for ( var i = 0 ; i < ps.length; i ++ ) {
69 if (ps[i] == pagingToolbar.pageSize) {
70 slider.setValue(i);
71 }
72 }
73 }
74 });
75
76 }
77 });
代码下载:/Files/badwps/ExtPagingExample.rar (Extjs文件夹中的Ext库文件删了,自己手动加回去吧,基于ext3.3)
文章转载来至:http://www.cnblogs.com/badwps/archive/2011/04/15/2016440.html