与服务器交互的分页组件PageComponent

Ext.define(‘tools.PageComponent‘, {
	extend : ‘Ext.Container‘,
	requires : [],
	config : {
	params : null,
        itemTpl : null,//list的itemTpl
        emptyText : "没有内容",
        title : null,//标题
        currentPage : 1,//当前页(不用配置)
        pageCount : null,//总共多少页(不用配置)
        countPerPage : 10,//每一页显示多少条数据
        storeName : null,//store的全名
        //ajax请求需要的参数
        url : null,
        method : null,
        xmlns : null,
        //当前页码的变量名
        pageIndexName : ‘pageIndex‘,
        //每页显示条数的变量名
        pageSizeName : ‘pageSize‘,

        resultMsgName : ‘resultMsg‘,
        totolName : ‘total‘,

        //每块数据的块头的名字
        dataContainerName : null,
		layout : ‘fit‘,
		items : [{
			xtype : ‘toolbar‘,
			docked : ‘top‘,
			items : [{
				xtype : ‘button‘,
				iconCls : ‘arrow_left‘,
				handler : function(button) {
					system.backView();
				}
			}, {
				xtype : ‘button‘,
				iconCls : ‘refresh‘,
				right : 0,
				top : 5,
				handler : function(button) {
					var me = button.getParent().getParent();
					me.refreshFn();
				}
			}]
		}, {
			xtype : ‘list‘,
            itemId : ‘list‘,
			loadingText : false/*,
            listeners : {
                itemtap : function( list, index, target, record, e, eOpts ){
alert(‘test‘);
                    var me = this.getParent();
                    me.fireEvent(‘itemsingletap‘, list, index, target, record, e, eOpts );
                }
            }*/
		}, {
			xtype : ‘toolbar‘,
            itemId : "toolbar",
			docked : ‘bottom‘,
			hidden : true,
			items : [{
				xtype : ‘button‘,
                itemId : ‘prevBtn‘,
				iconCls : ‘arrow_left‘,
				handler : function(button) {
					var me = this.getParent().getParent();
					me.prevPageFn();
				}
			}, {
				xtype : ‘button‘,
                itemId : ‘pageBtn‘,
				text : ‘1/1‘
			}, {
				xtype : ‘button‘,
                itemId : ‘nextBtn‘,
				iconCls : ‘arrow_right‘,
				handler : function(button) {
					var me = this.getParent().getParent();
					me.nextPageFn();
				}
			}]
		}]
	},
	initialize : function() {
		this.callParent();
		var list = this.down("#list");
		list.setEmptyText(this.getEmptyText());
        list.setItemTpl(this.getItemTpl());
		list.setStore(Ext.create(this.getStoreName()));
        //讲list的主要事件抛出去给当前类去实现
        list.on(‘itemtap‘, this.itemtap);
        list.on(‘itemdoubletap‘, this.itemdoubletap);
        list.on(‘itemsingletap‘, this.itemsingletap);
        list.on(‘itemswipe‘, this.itemswipe);
        list.on(‘itemtaphold‘, this.itemtaphold);
        list.on(‘itemtouchend‘, this.itemtouchend);
        list.on(‘itemtouchmove‘, this.itemtouchmove);
        list.on(‘itemtouchstart‘, this.itemtouchstart);
		this.refreshFn();
	},
	pagingFn : function() {
        var params = this.getParams();
		var me = this;
        var xmlStr = util.createArrayXmlStr(params);
        var pageIndexName = this.getPageIndexName();
        var pageSizeName = this.getPageSizeName();
        var len = params.length;
        var str = ‘‘;
        for(var x=0;x<len;x++) {
            str += params[x] + ‘,‘;
        }
        var soapStr = this.getMethod() +","+ this.getXmlns() +","+ str + pageIndexName +","+ this.getCurrentPage() +","+ pageSizeName +","+ this.getCountPerPage();
		var xmlData = system.setXmlParameterSoapByStr(soapStr);//自定义框架的拼接xml报文方法
console.log(xmlData);
		Ext.Ajax.request({
			url : me.getUrl(),
			xmlData : xmlData,
			scope : me,
			success : me.successFnOfPaging
		});
	},
	successFnOfPaging : function(result) {
		var str = $.parseXML($(result.responseText).children().text());
        var me = this;
console.log(str);
        if($(str).find(me.getDataContainerName()).text()) {
            this.setPageCount(Math.ceil($(str).find(me.getTotolName()).text()[0] / (this.getCountPerPage())));//$(str).find(me.getTotolName()).text()[0]不取0的话会将所有的值串起来
            me.down("#list").getStore().setData(this.strToData(str));//为list设置store
            this.applyPageNum();//设置当前页/总页
            this.changeBtnStatus();//改变工具栏的显示或隐藏
            this.setPageCount(null);
        } else if($(str).find(me.getResultMsgName()).text()){//有resultMsg
            alert($(str).find(me.getResultMsgName()).text());
            return;
        } else {
            alert("没有数据");
        }
	},
	strToData : function(str) {
		var me = this;
		var data = [];
		$(str).find(me.getDataContainerName()).each(function(index) {
            var fields = me.down("#list").getStore().getFields();
            var len = fields.length;
            data[index] = {};
            for(var x=0;x<len;x++) {//自动装配xml的数据到store的data中
                var str = ‘data[‘+index+‘].‘ + fields[x] + ‘ = $(this).find("‘ + fields[x] + ‘").text()‘;
                eval(str);
            }
		});
        var toolbar = me.down("#toolbar");
		if (this.getPageCount() > 1) {
            toolbar.show();
		} else {
            toolbar.hide();
		}
		return data;
	},
	//上一页
	prevPageFn : function() {
		this.setCurrentPage(this.getCurrentPage() - 1);
		this.pagingFn();
	},
	//下一页
	nextPageFn : function() {
        this.setCurrentPage(this.getCurrentPage() + 1);
		this.pagingFn();
	},
	applyPageNum : function() {
        var pageBtn = this.down("#pageBtn");
        pageBtn.setText(this.getCurrentPage() + ‘/‘ + this.getPageCount());
	},
	changeBtnStatus : function() {
        var prevBtn = this.down("#prevBtn");
        var nextBtn = this.down("#nextBtn");
		if (this.getCurrentPage() == 1) {
            prevBtn.disable();
		} else {
            prevBtn.enable();
		}
		if (this.getCurrentPage() == this.getPageCount()) {
            nextBtn.disable();
		} else {
            nextBtn.enable();
		}
	},
	refreshFn : function() {
		this.setCurrentPage(1);
		this.pagingFn();
	},
	//list的主要事件
    itemdoubletap : function(list, index, target, record, e, eOpts) {
    },
    itemsingletap : function(list, index, target, record, e, eOpts) {
    },
    itemswipe : function(list, index, target, record, e, eOpts) {
    },
    itemtap : function(list, index, target, record, e, eOpts) {
    },
    itemtaphold : function(list, index, target, record, e, eOpts) {
    },
    itemtouchend : function(list, index, target, record, e, eOpts) {
    },
    itemtouchmove : function(list, index, target, record, e, eOpts) {
    },
    itemtouchstart : function(list, index, target, record, e, eOpts) {
    }
});

使用方法,这里比较特殊,以往都是直接使用,这个组件需要子类继承配置使用,使用的时候定义一个这个类的子类。然后根据需要配置相应的值。然后重写需要的list点击事件的方法;

比如。这里定义了一个PageListView:

Ext.define(‘EmergencyDrill.view.pagelist.PageListView‘, {
	extend : ‘tools.PageComponent‘,
	xtype : ‘pagelistview‘,
	alternateClassName : ‘pagelistview‘,
	requires : [],
	config : {
        pageComponentId : ‘yjylpage‘,
		params : [‘userId‘, localStorage.username, ‘flowName‘, ‘EmergencyDrillProcess‘],
        itemTpl : ‘<div><span>{title}</span></br><span>{completeTimeLimit}</span></br><span>{taskDisplayName}</span></br><span>{taskOwner}</span>‘ +
            ‘<tpl if="sheetStatus == 0"><span>未阅知</span><tpl else><span>已阅知</span></tpl></div>‘,
        emptyText : "没有内容",
        title : ‘应急演练列表‘,
        currentPage : 1,
        pageCount : null,
        dataContainerName : ‘worksheet‘,
        storeName : ‘EmergencyDrill.store.EmergencyPageListStore‘,
        url : config.serviceUrl + ‘WorkSheetMobile‘,
        method : ‘showListWorkSheet‘,
        xmlns : config.xmlns
//        countPerPage : 10,
//        pageIndexName : ‘pageIndex‘,
//        pageSizeName : ‘pageSize‘,
//        resultMsgName : ‘resultMsg‘,
//        totolName : ‘total‘,
    },
    initialize : function() {
        this.callParent();
    },
    itemtap : function(list, index, target, record, e, eOpts) {
        system.param = {//自定义框架跳转页面是参数传递
            sheetId : record.get(‘sheetId‘)
        };
        system.pushView(‘detailview‘);//自定义框架跳转页面
    }
});

这个类中我只覆写了itemtap事件。效果图如下:

页面样式没有调,就将就看吧,这里下面的工具条没有显示出来,因为源码中我设置了需要总的条数要大于每一页显示的条数才会显示出下面的工具条(即上一页,当前页/总页,下一页);

如果总页数超过1页的话就会有这个工具条:

好了,这就是我的与服务器交互的分页组件;

与服务器交互的分页组件PageComponent

时间: 2024-10-10 10:14:40

与服务器交互的分页组件PageComponent的相关文章

java分页组件简单设计(贼简单)

代码很简单,关键是思想. 每个业务模块基本都会涉及到分页的应用,不管是普通的分页浏览还是瀑布流形式的浏览.分页可以减轻服务器的压力,可以节俭页面布局.在我们的分页简单组件设计中,主要是需要返回给客户端四个数据:列表对象.当前页码.每页记录最大条数.记录总数. 列表对象:顾名思义,就是展示给用户看的当前页面记录: 当前页码:主要是需要js来高亮: 每页记录最大条数:一般是服务器设定 记录总数:js用来计算总页数使用 设计思想: 1.由于分页是一种可以公共使用的功能,所以可以开发成一个组件,这样可以

基于Vue.js的表格分页组件

BootPage组件简介 其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件库里分页组件都功能太强大或者没有适合我的,所以就自己写了一个凑合着用,或许有人和我一样需要这样一个简单的分页组件来实现简单的分页功能,我便在这里分享一下,大家自觉填坑咯. 如需高大上的组件,可以移步Vue官方组件库:https://github.com/vuejs/awesome-vue#libraries--plugins BootPage是一款支

我的开源框架之交互控制、组件通用工具封装

需求: (1)后期的jquery组件具有一些通用的需求,如ajax请求,数组的处理等 (2)从系统UI与服务器集成的角度看,一个系统的前端交互需要做一个统一的封装来接受用户交互,同时统一于服务器的请求 (3)前端的日志功能需要统一 (4)统一的验证入口 (5)综上:我们需要一个封装了通用表单操作(表单转对象,对象填充到表单,打开一个窗口),封装系统前端的统一ajax交互,ajax交互返回格式统一以便做统一处理. 初步代码实现(后期将会根据实际需求调整) 1 /******************

ReactJS实现的通用分页组件

大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果:    注意这个组件需要ES6环境,最好使用NodeJS结合Webpack来打包:webpack --display-error-details --config webpack.config.js 此React版分页组件请亲们结合redux来使用比较方便,UI = Fn(State)    基本

JavaScript模仿实验室分页组件

原文摘自我的前端博客,欢迎大家来访问 http://hacke2.github.io 起因 刚才蔡哥让我重启一下邻水项目服务器,我顺便有回顾了一下去年做的项目..当时我的任务是园区动态+配置管理,园区动态里有个分页 当时是拿实验室以前项目:泛教育分页组件做的,完全是拿来主义,现在看到,就像用javascript实现一下,没什么技术含量,设计思路也是 至少7年前的,直接一个a标签打开一个连接,将你的当前页数传到后台去.什么时候再做一个AJAX的. 分析 邻水分页如下图: 现在数据还不是很多,显示了

Vue.js的表格分页组件

转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋可以移步我的上一篇文章<浅谈Vue.js>了解一下. BootPage组件简介 其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件

dwz框架分页组件使用

dwz框架分页组件应用. <div class="panelBar" >     <div class="pages">         <span>显示</span>         <select name="pageSize" onchange="navTabPageBreak({numPerPage: this.value})">             &l

打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件

第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demoback.lalalaweb.com  前台:demo.lalalaweb.com 演示过程中可能会发现bug,希望即时留言反馈,谢谢 源码下载:https://github.com/sutianbinde/classweb               //不是全部的代码,每次更新博客才更新代码 学

semantic、vue 使用分页组件和日历插件

最近正在试试semantic-ui,结合了vue,这里忍不住吐槽semantic和vue的友好度简直不忍直视,不过既然用了,这里就分享几个用到的插件了 1.分页组件(基于vue) var pageComponent = Vue.extend({ template: `<div class="ui floated pagination menu"> <a class="icon item" :class="{\'disabled\':cur