`

前台分页, 我这里总结一下工作中实现的几种 Ext tree 和 grid 的分页问题。

阅读更多

1、tree 的分页。
        当树中的叶子节点过多的时候,游览器就承受不了,很容易死机,当然可以通过异步树,点击树的一个
    节点文件节点时,才异步的到后台抓取对应的子节点。当一个节点下面的子节点也很多的时候,异步可能也
    解决不了你的问题。其浏览器不怕你在内存中存多少节点,只是怕页面上一次显示多少节点,当显示的节点
    于一百个的时候,你的游览器可能就会受不了了。原因我也不明的。其实这种情况我也没有遇到过,但是这
    种情形就要求我们对tree的节点进行分页。
   
    1.1 程序控制的方式。
        我们从后台把树的节点一次性都从后台加载到前台。让节点的json数据如下:
        {"totalCount":7,"records":[
            {"id":"1","text":"parent directory","'leaf":false,"start":0,children:[
                {"id":"1.1",text:"sub node 1","leaf":true,"index":1},
                {"id":"1.2",text:"sub node 2","leaf":true,"index":2},
                {"id":"1.3",text:"sub node 3","leaf":true,"index":3},
                {"id":"1.4",text:"sub directory","leaf":false,"start":0,children:[]},
                {"id":"1.5",text:"sub node 4","leaf":true,"index":4},
                {"id":"1.6",text:"sub node 5","leaf":true,"index":5}
            ]},
            {"id":"2","text":"parent directory","'leaf":false,children:[
                {"id":"2.1",text:"sub node 1","leaf":true,"index":1},
                {"id":"2.2",text:"sub directory","leaf":false,"start":0,children:[]},
                {"id":"2.3",text:"sub node 2","leaf":true,"index":2},
                {"id":"2.4",text:"sub node 3","leaf":true,"index":3},
                {"id":"2.5",text:"sub node 4","leaf":true,"index":4},
            ]}           
        ]}
       
        手写的数据,不能测试用的。数据结构中有两个一层文件夹。我们注意到子节点中的叶子节点都是有一个
    index属性,文件夹节点都有一个start属性。这些序号就是前台分页的依据。相信大家都能够想到了前台我们呆要给出 start, pageSize 然
    后通过index属性就可以过滤出某一页中的记录。下面是tree config 中的一些:
    id        : 'tree',
    listeners : {
        beforeexpandnode:       function(node, deep, anim) {
            if (node.findChild('leaf', true)) {
                。。。。
                //show paginated nodes
                node.eachChild(function(child){
                    if (child.isLeaf()) {
                        currentIndex = child.attributes.index;
                        if(currentIndex >= node.attributes.start && currentIndex <= node.attributes.end) {
                            child.getUI().show();
                        } else {
                            child.getUI().hide();
                        }
                    }
                });
               
                //show paginator
                preSpace = ' | ';
                prevLink = "<a class='tree_paginator' href='#' onclick=\"Ext.getCmp('tree').rollPageDown(Ext.getCmp('tree').getNodeById('" + node.id + "')); return false;\">&lt; Previous "+ pageSize +"</a>";
                nextLink = "<a class='tree_paginator' href='#' onclick=\"Ext.getCmp('tree').rollPageUp(Ext.getCmp('tree').getNodeById('" + node.id + "')); return false;\">Next "+ pageSize +" &gt;</a> ";
                recordRange = node.attributes.start+' to '+ node.attributes.end+' of '+total;
               
                dragLink = '';
                if (this.getLoader().baseParams.brief) {
                    dragLink = " <a href='#' onclick=\"processDrag(Ext.getCmp('tree').getNodeById('" + node.id + "'),"+node.attributes.start+","+this.getLoader().baseParams.size+");\">Invite all displayed</a>";
                }
                if (node.attributes.start == 1) {
                    if (parseInt(total) <= pageSize) {
                        $("#"+node.id+"_paginator").html(preSpace + recordRange + dragLink);
                    } else {
                        $("#"+node.id+"_paginator").html(preSpace + recordRange +' | ' + nextLink + dragLink);
                    }
                } else if (node.attributes.start > 1 && node.attributes.end < parseInt(total)){
                    $("#"+node.id+"_paginator").html(preSpace + prevLink + ' | ' + recordRange + ' | ' + nextLink + dragLink);
                } else if (node.attributes.end >= parseInt(total)) {
                    $("#"+node.id+"_paginator").html(preSpace + prevLink + ' | ' + recordRange + dragLink);
                } else {
                    $("#"+node.id+"_paginator").html('');
                }
            }
        }
    },
    rollPageUp: function(node) {
        if (node.findChild('leaf', true)) {
            if (!node.attributes.children) {
                this.getLoader().baseParams.start = node.attributes.end;
            }
            node.attributes.start = node.attributes.end + 1;
            this.getLoader().load(node, function() {
                node.expand();
            });
        }
    },
    rollPageDown: function(node) {
        if (node.findChild('leaf', true)) {
            if (!node.attributes.children) {
                this.getLoader().baseParams.start = node.attributes.start - this.getLoader().baseParams.size -1;
            }
            node.attributes.start = node.attributes.start - this.getLoader().baseParams.size;
            this.getLoader().load(node, function() {
                node.expand();
            });
        }
    },
    .... 
   
    过程是这样子的: 当   this.getLoader().load()成功后 node.expand() node 展开时 发生 beforeexpandnode 事件。通过事件中 currentIndex 如果在
    当页内 则 child.getUI().show(),否则 child.getUI().hide(); 另一个地方就是生成分页信息,与 上一页rollPageUp,下一页rollPageDown的实现。
 
   1.2 Ext扩展类:Ext.ux.tree.PagingTreeLoader。 
       这种方法应该经上面的方法要上一些吧。我没有用它。因为是后来才知道有这个东西的。强人太多了。
       网址:http://www.iteye.com/topic/232161。
      
   2.  Ext gird的前台分页。
   方法一: 1、store 中 一次性从后台url 中得到所以数据
            2、利用 store.filterBy(function(){  过滤动作 })  过滤掉不是当前页的数据。
            3、由于 store是过滤了的,所以分页信息会有错误,如总记录数不会变,而实际上因为有些过滤了,所以总记录数应该少了。
               其次用url做proxy的store一般分页的button都会从后台读数据,我们应该按自己的需求去实现一个新的Ext.ux.FrontPagingToolBar 下面是我根据自己的需求实现的一个:
Ext.FrontPagingToolbar = Ext.extend(Ext.PagingToolbar,{
    doLoad : function(start){
        var o = {}, pn = this.paramNames;   
        o[pn.start] = start;
        o[pn.limit] = this.pageSize;
        if(this.fireEvent('beforechange', this, o) !== false){
//          this is default action to request url when change paging. so I changed it. 
//          this.store.load({params:o});
            this.onLoad(this.store,null,{params:o});
              var pos = -1;
              this.store.filterBy(function(el){
                  if ('users' == this.storeId && el.data['network'] != pn.network.id) return false;
                 
                  pos++;
                  if (pos<start || pos >start+o[pn.limit]-1) return false;
                 
                  return true;
              });

        }
    },
    getPageData : function(){
        var pn = this.paramNames
        var storeId = this.store.storeId;
        var total = 0;
        // the total count is changed . nolong count(this.store.snapshot) this.store.data is changing
        var data = this.store.snapshot ? this.store.snapshot : this.store.data ;
        data.each(function(){
            if (!('users' == storeId && this.data.network != pn.network.id)) total++;
        });
       
        return {
            total : total,
            activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),
            pages :  total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)
        };
    }   
});
              
   方法二:1、网上下载一个 Ext.ux.data.PagingMemoryProxy.js 用户扩展。
              这个扩展有一个好处就是它的数据是前台的内存中,所以可以用ajax的方法一点一点的把记录加放到这个store的内存中。配合PagingMemoryProxy的
              过滤功能,可以完成强大的功能,它比方法的好在 可以每次加载一点点数据,且不用自己去扩展一个分页的类。
             
   方法三:3、这个是王蕴真还在实现的。现在原理大约是这样子,一次性加载所有的数据,存在一个records数组中然后每次显示数据时候调用 store.loadData();
              把当前页要显示的记录从records中过滤出来到data中,而后再 store.loadData(data);
              我觉得这方法有一个问题就是与方法一同样会遇到 pagingBar 上下页按纽请求的是一个url Ajax请求。这是不对的。我得看看王蕴真怎么解决这个问题。                  
  
   2.  Ext gird 切换store。
      有时候,我们一个grid表格是的数据可能来自不同的地方,有的可能来的自己的网站,有的可能是别人提供的服务,这个时候很有可能两个地方返回的json数据结
      构是不一样的。但是必须同时在一个grid中切换,这个时候一个较好的解决方法就是用两个或更多的store.
     
      这里给一个例子:
     
      initComponent: function() {
        var users = new Ext.data.JsonStore({
            storeId: 'users',
            url: '/users',
        });
        var schoolars  = new Ext.data.JsonStore({
            storeId: 'schoolars',
            url: '/peoples',
        });
        var pagingBar = new Ext.FrontPagingToolbar({
            pageSize: 3,
            store   : users
        });
       
        Ext.grid.InnovatorGridPanel.superclass.initComponent.call(Ext.apply(this, {
            bbar      : pagingBar,
            pageBar   : pagingBar,  
            store     : users
        }));
     },
     swithStore : function(network) {
        if ('Scholar Universe' == network.name) {
            this.reconfigure( Ext.StoreMgr.get('schoolars'), new Ext.grid.ColumnModel(this.columns));
            this.pageBar.bind(Ext.StoreMgr.get('schoolars'));
        } else {
            this.reconfigure( Ext.StoreMgr.get('users'), new Ext.grid.ColumnModel(this.columns));
            this.pageBar.bind(Ext.StoreMgr.get('users'));         
        }
       
        this.pageBar.paramNames = {network:network,start:0,limit:3};
     }
    
     关键在
           this.reconfigure( Ext.StoreMgr.get('schoolars'), new Ext.grid.ColumnModel(this.columns));
           this.pageBar.bind(Ext.StoreMgr.get('schoolars'));
     它们更换了grid的store.并将分页也重新关联到新的store上。

分享到:
评论

相关推荐

    ext grid tree 应用

    在EXT JS框架中,"ext grid tree 应用"是一个常见的功能组合,它结合了Grid面板和Tree面板的优势,用于展示复杂的数据结构。Grid通常用于显示二维表格数据,而Tree则用于展示层次化的数据。在这个例子中,开发者通过...

    ext tree grid 的高级实例运用

    在EXT JS这个强大的JavaScript框架中,`Tree`和`Grid`是两个非常重要的组件,用于构建数据密集型的用户界面。在"ext tree grid 的高级实例运用"中,我们将深入探讨如何有效地结合这两个组件,实现复杂的交互功能。...

    EXT树表分页(SERVLET)

    在EXT中,树(Tree)和表格(Grid)是两种重要的数据展示组件,它们可以单独使用,也可以结合成树表(TreeGrid)以同时展示层次结构和表格数据。 在EXT树表中,分页(Pagination)是一项关键功能,用于处理大量数据...

    EXT 分页,树形结构案列

    EXT 分页与树形结构是EXT JavaScript框架中的两种核心特性,它们在开发高效、互动性强的Web应用程序时扮演着重要角色。EXT是一个强大的客户端JavaScript库,用于构建富互联网应用程序(RIA)。在这里,我们将深入...

    Ext grid与树实例

    Ext Grid和Tree是Ext JS库中的两种重要组件,它们在Web应用开发中广泛用于数据展示和组织。Ext JS是一个强大的JavaScript框架,它提供了一系列高级UI组件,帮助开发者构建功能丰富的、交互性强的Web应用程序。 首先...

    ext实例 左边是 tree 右边是grid 双击grid弹出form修改

    本实例“ext实例 左边是 tree 右边是grid 双击grid弹出form修改”是针对初学者的一个宝贵资源,它演示了如何将这些组件结合起来,实现交互式的数据操作。 1. **树形控件(Tree)**:在左边展示数据结构,通常用于...

    Ext中对于多种store数据分页实现示例

    这篇博客“Ext中对于多种store数据分页实现示例”将深入探讨EXT JS中如何实现数据的分页展示,这对于处理大量数据的应用至关重要。 首先,EXT JS提供了两种主要的分页方式:服务器端分页(Server-side pagination)...

    ExtGrid使用

    ExtGrid是Ext JS库中的一个核心组件,常用于在Web应用程序中展示数据并提供操作功能。这个例子在.NET环境中展示了如何有效地使用ExtGrid,包括显示数据、增删改查(CRUD)操作以及分页功能。下面将详细介绍这些知识...

    ext treegrid

    Ext TreeGrid是一款在Ext JS框架下开发的组件,它结合了Tree和Grid的优点,提供了一种既能展示层次结构数据又能进行表格样式的显示和操作的视图。在Ext JS库中,Tree通常用于展现层级关系的数据,而Grid则用于显示二...

    EXT组件初学者教程 grid+tree+window+描述文档

    - 文件"EXT组件grid+tree+window.docx"很可能包含了EXTJS组件的具体实现代码,以及代码中的关键属性和方法解释,帮助初学者理解组件的工作原理和配置方式。 - "role"和"rolePermission"可能是示例中的数据模型或者...

    ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局

    在"ExtJS4官方指南翻译:DragandDrop拖放/Grid组件/Tree组件/容器与布局"中,我们将会探讨以下几个核心概念: 1. **Drag and Drop(拖放)**: ExtJS4提供了完善的拖放支持,允许用户通过鼠标操作在界面上移动元素...

    ext grid 基本功能的学习 另付js 对上周月季度的计算等

    Ext Grid是Ext JS框架中的一个核心组件,用于创建数据驱动的表格视图。在这个学习资料中,我们将深入探讨Ext Grid的基本功能,包括数据加载、定时器筛选、分组以及JavaScript库对日期的处理,如计算上周、上月和上...

    ext 资源汇总

    这个"EXT 资源汇总"包含了一系列与EXT相关的组件,如表单(Ext.form)、网格(Ext.grid)和树形视图(tree)。这些组件是EXT的核心功能,允许开发者创建交互式的用户界面。 1. **EXT.form**: EXT.form模块提供了...

    Ext 开发指南 学习资料

    2.7.5. 谣言说ext不支持前台排序 2.8. 爱生活,EditorGrid。 2.8.1. 旋动舞步,看我们怎么把这个EditorGrid炫出来。 2.8.2. 添加一行,再把它踢掉 2.8.3. 一切就绪,你可以按保存按钮了。 2.8.4. 天马行空,保证提交...

    EXT导出Excel代码demo

    EXT的Grid组件提供了内置的分页功能,通过配置store的paging参数和使用PagingToolbar组件,可以轻松实现数据的分页加载和导航。在导出Excel时,你可能需要考虑是否一次性导出所有分页数据,还是只导出当前显示的页面...

    Ext3.4 demo

    这个“Ext3.4无限极tree grid demo”是展示如何在Ext3.4中实现一个具有无限层级的树形网格视图,它结合了树结构和表格数据的显示,提供了灵活的数据组织和交互方式。 在Ext3.4中,Tree Grid是一种特殊的组件,它...

    EXT2.0中文教程

    把表单和输入控件都改成ext的样式。 4.1. 不用ext的form啊,不怕错过有趣的东西吗? 4.2. 慢慢来,先建一个form再说 4.3. 胡乱扫一下输入控件 4.4. 起点高撒,从comboBox往上蹦 4.4.1. 凭空变出个comboBox来。 ...

    Ext 3.0 中文文档.zip

    Ext 3.0 是一个广泛使用的JavaScript框架,用于构建富客户端Web应用程序。它以其强大的组件化和数据绑定功能而闻名,使得开发复杂的交互式界面变得简单。这份"Ext3.0中文文档"提供了全面的指南,帮助开发者深入理解...

    ext的edittreegrid实现

    在EXT JS库中,"ext的edittreegrid实现"是一种功能强大的组件,它结合了树形视图(Tree)和编辑网格(EditorGrid)的功能,允许用户在具有层次结构的数据上进行直观的编辑操作。这个组件对于那些需要管理结构化且...

    editTreeGrid ext可编辑的treegridpanel

    在EXT JS这个强大的JavaScript框架中,`TreeGrid`是一种结合了树形结构和表格功能的组件,它允许用户同时展示数据的层次结构和表格信息。`editTreeGrid`是EXT JS中的一个特例,它是可编辑的TreeGrid面板,提供了在树...

Global site tag (gtag.js) - Google Analytics