`
starbhhc
  • 浏览: 655240 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

extjs学习笔记(四)

阅读更多
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类的对象,所以我们先来构造它:

1var store = new Ext.data.JsonStore({
2        root: 'topics',
3        totalProperty: 'totalCount',
4        idProperty: 'threadid',
5        remoteSort: true,
6
7        fields: [
8            'title', 'forumtitle', 'forumid', 'author',
9            { name: 'replycount', type: 'int' },
10            { name: 'lastpost', mapping: 'lastpost', type: 'date', dateFormat: 'timestamp' },
11            'lastposter', 'excerpt'
12        ],
13
14        // 因为跨域,所以使用ScriptTagProxy,在同一个域里边用HttpProxy
15        proxy: new Ext.data.ScriptTagProxy({
16            url: 'http://extjs.com/forum/topics-browse-remote.php'
17        })
18    });
    这一次,我们使用了JsonStore类来构造所需要的Store对象,顾名思义,这是用来转化son格式的数据的。另外我们是从外部服务器来获取数据,所以代码相对于原来从数组里边获得数据要复杂一些,我们来看看用到的那些参数的意义:
    root:包含数据行集合的属性名字。
    totalProperty:表示数据集中全部记录数的属性名字,只有在分页的时候才需要。
    idProperty:数据行中用来作为标识的属性的名字。
    remoteSort:排序的时候是否通过proxy获得新的数据,默认是false。
    fields:上一个系列里边提到过。这里多了一个mapping,它是将数据里边的名字映射成封装后的Record字段的名字,名字相同的时候,可以忽略。
    proxy:数据的来源。在这里,我们只需要知道我们的数据是从url指明的地址获得的,因为这个地址是跨域的,所以使用ScriptTagProxy。
    需要注意的是,从服务器返回的数据必须具有如下的格式:

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

1var pagingToolbar = new Ext.PagingToolbar({
2        pageSize: 25,
3        store: store,
4        displayInfo: true,
5        displayMsg: 'Displaying topics {0} - {1} of {2}',
6        emptyMsg: "一篇文章也没有",
7        items: [
8                '-', {
9                    pressed: true,
10                    enableToggle: true,
11                    text: 'Show Preview',
12                    cls: 'x-btn-text-icon details',
13                    toggleHandler: function(btn, pressed) {
14                        var view = grid.getView();
15                        view.showPreview = pressed;
16                        view.refresh();
17                    }
18}]
19    });
    (不知道vs2008的格式化功能为什么把第18行的括号给放在最靠左边的位置,望哪位朋友知道解决的方法告知一下。)
    items是工具栏上项的集合,默认的类型是按钮。我们这里只用到了两项,“-”代表分隔符,第二项就是一个button,我们来看看其中每个属性都表示什么:
    pressed:表示按钮在开始的时候是否被按下,只有enableToggle为真的时候才有用。
    enableToggle:指示button是否能处于被按下的状态。
    text:按钮上显示的文本。
    cls:按钮的css类。
    toggleHander:设置enableToggle为true时点击按钮时的事件处理函数。
    是时候把分页工具栏和grid组合在一起了,这次我们的grid没有使用ColumnModel而是使用columns属性,同时我们使用了viewConfig来对用户界面进行配置,看下完整的代码吧:

  1///<reference path="vswd-ext_2.0.2.js" />
  2/**//*
  3*作者:大笨
  4*日期:2009-10-13
  5*版本:1.0
  6*博客地址:http://yage.cnblogs.com
  7*/
  8Ext.BLANK_IMAGE_URL = '../extjs/resources/images/default/s.gif';
  9Ext.onReady(function() {
10    //构造store
11    var store = new Ext.data.JsonStore({
12        root: 'topics',
13        totalProperty: 'totalCount',
14        idProperty: 'threadid',
15        remoteSort: true,
16
17        fields: [
18            'title', 'forumtitle', 'forumid', 'author',
19            { name: 'replycount', type: 'int' },
20            { name: 'lastpost', mapping: 'lastpost', type: 'date', dateFormat: 'timestamp' },
21            'lastposter', 'excerpt'
22        ],
23
24        // 因为跨域,所以使用ScriptTagProxy,在同一个域里边用HttpProxy
25        proxy: new Ext.data.ScriptTagProxy({
26            url: 'http://extjs.com/forum/topics-browse-remote.php'
27        })
28    });
29
30    store.setDefaultSort("lastpost", "DESC");  //设置默认的排序列和方向
31
32    //构造带分页功能的工具栏
33    var pagingToolbar = new Ext.PagingToolbar({
34        pageSize: 25,
35        store: store,
36        displayInfo: true,
37        displayMsg: '第{0}-第{1}条,一共{2}条',
38        emptyMsg: "No topics to display",
39        items: [
40                '-', {
41                    pressed: true,
42                    enableToggle: true,
43                    text: '预览',
44                    cls: 'x-btn-text-icon details',
45                    toggleHandler: function(btn, pressed) {
46                        var view = grid.getView();
47                        view.showPreview = pressed;
48                        view.refresh();
49                    }
50}]
51    });
52
53    //构造带有分页工具栏的grid
54    var grid = new Ext.grid.GridPanel({
55        renderTo:"grid",
56        width: 700,
57        height: 500,
58        title: '带分页功能的grid',
59        store: store,
60        trackMouseOver: false,
61        disableSelection: true,
62        loadMask: true,
63
64        // grid的列
65        columns: [{
66            id: 'topic',
67            header: "主题",
68            dataIndex: 'title',
69            width: 420,
70            renderer: renderTopic,
71            sortable: true
72        }, {
73            header: "作者",
74            dataIndex: 'author',
75            width: 100,
76            hidden: true,
77            sortable: true
78        }, {
79            header: "回复数",
80            dataIndex: 'replycount',
81            width: 70,
82            align: 'right',
83            sortable: true
84        }, {
85            id: 'last',
86            header: "最后回复",
87            dataIndex: 'lastpost',
88            width: 150,
89            renderer: renderLast,
90            sortable: true
91}],
92
93            // 定制用户界面
94            viewConfig: {
95                forceFit: true,
96                enableRowBody: true,
97                showPreview: true,
98                getRowClass: function(record, rowIndex, p, store) {
99                    if (this.showPreview) {
100                        p.body = '<p>' + record.data.excerpt + '</p>';
101                        return 'x-grid3-row-expanded';
102                    }
103                    return 'x-grid3-row-collapsed';
104                }
105            },
106           
107            //在顶部的分页工具栏
108            //tbar: pagingToolbar,
109           
110            // 在底部的分页工具栏
111            bbar: pagingToolbar
112        });
113
114        // 加载数据
115        store.load({ params: { start: 0, limit: 25} });
116
117        // 主题列的renderer函数
118        function renderTopic(value, p, record) {
119            return String.format(
120                '<b><a href="http://extjs.com/forum/showthread.php?t={2}" target="_blank">{0}</a></b><a href="http://extjs.com/forum/forumdisplay.php?f={3}" target="_blank">{1} Forum</a>',
121                value, record.data.forumtitle, record.id, record.data.forumid);
122        }
123        //最后回复列的renderer函数
124        function renderLast(value, p, r) {
125            return String.format('{0}<br/>by {1}', value.dateFormat('M j, Y, g:i a'), r.data['lastposter']);
126        }
127    })
    运行下看看效果,我们可以看到在获取数据的时候,页面被动画遮盖住,如图:

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

    当点击列名进行排序时,会从服务器上重新加载新的数据,点击向右的箭头,可以翻页,还可以点点“预览”按钮看看效果。虽然这次的代码相对最简单的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的值来计算出应当返回的数据并且按照正确的格式来发送给客户端。至于服务器端如何获得客户端传递过来的参数和如何发送数据给客户端,可参阅本系列的第一节。
分享到:
评论

相关推荐

    ExtJS学习笔记.doc

    ExtJS学习笔记.docExtJS学习笔记.docExtJS学习笔记.docExtJS学习笔记.doc

    extJs 2.1学习笔记

    23. extJs 2.0学习笔记(Ext.Panel篇四) 62 24. extJs 2.0学习笔记(组件总论篇) 66 25. extJs 2.0学习笔记(Ext.Element API总结) 69 26. extJs 2.0学习笔记(Element.js篇) 73 27. extJs 2.0学习笔记(DomHelper.js篇) ...

    Extjs4.0学习笔记

    ExtJS4学习笔记(四)---Grid的使用 ExtJS4学习笔记(五)---Grid分页 ExtJS4学习笔记(六)---多表头Grid ExtJS4学习笔记(七)---带搜索的Grid(SearchGrid) ExtJS4学习笔记(八)---Grid多选/全选 ExtJS4学习笔记(九)...

    Extjs 5 学习笔记

    ### Extjs 5 学习笔记之 SenchaCmd 深入解析 #### 一、SenchaCmd 的简介 SenchaCmd 是一个跨平台的命令行工具,它为基于 ExtJS 和 Sencha Touch 应用程序的开发周期提供了全面的支持。从创建应用程序的基础结构到...

    ExtJs学习笔记 ExtJs Api

    适合ExtJs开发人员extjs技术上手以及深入

    界面框架extjs学习笔记

    EXTJS in Action 是一本专为学习EXTJS编写的书籍,但这里我们主要关注学习笔记中的关键知识点。 首先,EXTJS的目录结构非常重要,因为它包含了所有必要的资源和源码: 1. `adapter`:这部分包含了适配器,用于将...

    ExtJs简明教程+Extjs学习笔记

    ExtJs简明教程+Extjs学习笔记,来源网络,免费奉送,我讨厌需要资源分~

    语言程序设计资料:ExtJs学习笔记-2积分.doc

    语言程序设计资料:ExtJs学习笔记-2积分.doc

    extjs 学习笔记 四 带分页的grid

    extjs也不例外,它对分页也提供了强大而方便的支持,使得我们在分页处理上可以得心应手。 在extjs中,类Ext.PagingToolbar封装了关于分页的操作,该类从Toolbar继承而来,单从名字上看,我们也猜得出这是一个能够...

    extjs 学习心得笔记

    在探讨《ExtJS学习心得笔记》这一主题时,我们不仅会深入理解ExtJS框架的核心概念与实践技巧,还会从新手的角度出发,提炼出一系列有助于快速上手的学习策略,避免常见的学习陷阱,确保学习过程高效而有成效。...

    ExtJs学习笔记,共30讲

    这个学习笔记涵盖了从基础到高级的多个主题,帮助读者深入理解ExtJs的核心概念和技术。以下是一些关键知识点的详细说明: 1. **ExtJs 结构树**:这部分内容可能涉及ExtJs如何构建可自定义的用户界面组件树,包括...

    Extjs学习笔记有用

    ExtJS 是一个强大的JavaScript框架,主要用于构建富客户端Web应用程序。...学习ExtJS可以帮助开发者快速构建功能丰富的、交互性强的Web应用。通过深入理解和实践,可以提升开发效率,创建出符合现代Web标准的用户界面。

    Extjs4.0学习笔记大全.pdf

    Extjs4.0学习笔记大全.pdf,供大家学习

Global site tag (gtag.js) - Google Analytics