Extjs让Gridpanel组件自动滚屏

     刚学习了Ext的开发框架,发现这个东西还是挺不错的。

     后来公司让改变一个Gridpanel的展现方式,要求实现滚屏的效果。于是我就开始找API相关的功能了。找了很久,也没有找到框架的相应控制方法,然后在网上找了很久,也没有找到有人给去示例,无奈就只能自己写JS来控制了。为了给大家提供方便,这里我把我的探索结果发出来供大家借鉴参考。

    首先我去找到了Ext控制Gridpanel滚动条的方式,使用scrollBy

   scrollBy的文档是这样说明的:

scrollBy( Number/Number[]/Object deltaX, Number/Boolean/Object deltaY, Boolean/Object animate )

滚动组件target element 的元素由传入三角点,选择动画。
之后就是怎么样通过JS来控制他的自动滚屏了。

滚屏就要去获取当前Gridpanel里面内容的高度,如果高度小于当前容器的高度就不用滚屏了,相反,如果溢出就进行滚屏。

但是翻了api文档老半天也没有找到可以获取内容高度的方法,于是,我使用了debugger去查看组件的各个参数,果然,他有个属性记录了当前内容的高度

me.getView().getEl().el.lastBox.contentHeight;//me指的是当前的Gridpanel
然后获取了当前容器的高度
me.getView().getHeight();
但是,溢出之后要怎么样才能实现滚屏呢?这里可能根据自己的控制方法不一样,可以写出不一样的控制方式。

而我采用的是将查询结果复制拼接在当前的查询结果之后,这就产生了两片一样的内容(|A1|A2|),我控制的方式是初始化之后自动追加记录并让它自动向下滚动,当第一片记录的底部滚动到当前panel的顶部之后(A1|A2|  )刷新当前内容,这样就重新的使得内容的构成变成了初始化状态(|A1|A2|),这样我们就可以看到一个滚屏的错觉了。

添加重复记录到当前记录尾部的办法如下:

obj.each(function(record){//obj是当前的store,records是store里面的记录
	var re = record;
	var newrecord = record.data;
	delete newrecord.id;//追加的记录把'id'这个属性去掉,否则会使得事件失效
	newrecord.data=record.data;
	obj.add(newrecord);
});

这里面存在这一个问题,就是当我们的记录里面含有‘id’这个字段的时候,如果你追加上去的记录没有把id去掉,会使得js控制的事件失效,不相信你们可以去试试看,如果没有id 应该obj.add(records)就可以了吧,我没有试过,你们可以尝试看看。

滚动的控制代码使用:

me.getView().scrollBy(0,1);//滚动条向下移动一个像素

这里还要使用到setInterval、clearInterval,这两个方法来控制频率,具体的使用方法在W3C的文档中有介绍,大家可以去查阅。

这样,让Gridpanel自动滚屏就没有太大的障碍了。自己去设置一些标记来记录和控制就很好让它自动滚动起来了。我的实现方式如下,大家可以参考,

主要控制写在了store的load方法上了:

me.store = Ext.create('Ext.data.Store', {
			remoteSort : true,
			remoteFilter : true,
			autoLoad : true,
			autoSync : false,
			storeId : 'nstore',
			model : 'App.model.BoardInfo',
			proxy : {
				type : 'rest',
				format : 'json',
				url : *********,//你请求数据的json连接
				extraParams : params,
				reader : {
					type : 'json',
					root : 'records'
				},
				writer : {
					type : 'json'
				}
			},
			listeners:{
				load : function(obj, records, successful, eOpts) {
					var size = records.length;
					var tableHeight = me.getView().getHeight();
					var contentHeight = me.getView().getEl().el.lastBox.contentHeight;
					
					if(contentHeight > tableHeight){//当内容的行高大于表格的行高,即显示内容溢出的时候设置自动滚屏
						obj.each(function(record){
							var re = record;
							var newrecord = record.data;
							delete newrecord.id;//追加的记录把'id'这个属性去掉,否则会使得事件失效
							newrecord.data=record.data;
							obj.add(newrecord);
						});
						var topHeight = 0;
						function focusChange(){
							if(topHeight+1 < contentHeight){//topHeight+1减小时间上的误差产生的跳动
								me.getView().scrollBy(0,1);
								topHeight++;
							}
							else{
								me.getView().refresh();
								topHeight=0;
							}
						}
						if(!me.isReload){//这个标记是因为这块代码有自动刷新的控制,如果有自动reload又没有判断是不是更新了,你会发现你的滚屏速度会越来越快
							me.isReload=true;
							var noticeMar = setInterval(focusChange, 100);
							me.addListener('itemmouseenter',function(){
								clearInterval(noticeMar);
							});
							
							me.addListener('itemmouseleave',function(){
								noticeMar = setInterval(focusChange, 100);
							});
						}
					}
				}
			}
 });

大概介绍到这里,如果你想要实现Gridpanel的自动滚屏效果应该就没什么难度了。

滚动效果如附件图片所示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值