欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

ExtJs 4.2.1Grid行编辑后,页面滚动的解决方案_html/css_WEB-ITnose

程序员文章站 2024-01-20 11:03:16
...
  前段时间,公司里做个新玩意儿,我们开发组选用ExtJs4.2.1Mvc模式,开发过程中遇到了很多问题(避免不了不专业的需求人员提出各种一拍脑瓜子就决定的需求),经过查看api都一一解决,现在把开发过程中遇到的且已解决的问题,记录下来,供以后查看,也供新接触ExtJs的网友借鉴,描述不到位或有错误的地方,望指正!(注:下文中提到的方法均为ExtJs库中的方法,并非js原生)

  因为整个项目都是运用的ExtJs的MVC,所以项目中基本都是js文件(自定义的js文件接近100个,更不用说ExtJs的库了),导致页面加载很慢,性能问题就不提了,这是个老大难问题!

问题1:

  关于Grid页面滚动的问题,现在有一个Ext.grid.Panel,在这个grid中有两类数据,一类是可用数据,另一类是禁用数据,可用数据正常显示,禁用的则灰色显示(灰色显示利用grid的viewConfig的getRowClass属性可以做到,seems like this:

  getRowClass : function(record,rowIndex,rowParams,store){
return (record.get('youxiao1') == 0 || record.get('isedit') == 0) ? 'row-valid' :' ';
}

);

在这个grid中的两类数据是可以编辑的,当编辑后,为了实现两类数据不混乱显示,于是就用到了store.sort()方法,这个方法会导致grid内容出现滚动,用户不希望在编辑grid时总是滚来滚去,于是叫我们想想办法,于是我用了两天时间来完善这个需求(这过程中,使用了3中方式来实现,第三种方式最完美):

  方式一:直接使用focusRow( row, [delay] ),让某一行聚焦;

  方式二:获得当前编辑行和grid中第一行的record,然后通过getOffsetsTo()方法计算这两行记录在grid的垂直距离是多少,然后让滚动条滚动到这个距离值的位置,that's all!这个逻辑都在grid的viewConfig配置中实现,然后在编辑行后通过grid.getView().XXX()调用。在viewConfig中添加以下两个方法:

//滚动Grid到指定的Record
scrollToRecord:function(record){
var index = this.ownerCt.getStore().indexOf(record);
this.scrollToRow(index);
},

//滚动Grid到指定的行
scrollToRow:function(rowIndex){
var firstRow = Ext.get(this.getNode(0));   //grid中第一行
var row = Ext.get(this.getNode(rowIndex)); //当前编辑行
var distance = row.getOffsetsTo(firstRow)[1]; //获取垂直距离
//this.scroller.dom.scrollTop = distance;   this.scroller在Ext4.x中似乎没有这个属性,它只存在于3.x?
this.getEl().setScrollTop(distance);  //设置滚动条
}

  方式三:虽然前两种方式也能满足需求,但是不完美,现在说说最完美的解决方案,也是最简单的。

  在编辑行之前,先获得当前滚动条的位置:var scrollTop = grid.getView().getEl().getScrollTop(); //排序之前,grid滚动条的scrollTop

  在编辑结束之后,再将滚动条滚回最开始的位置:grid.getView().getEl().setScrollTop(scrollTop);

如果我们的Grid中有固定列,就是有些column设置了locked:true这个属性的话,就不能用上面的方法,将会无效,因为有locked的grid的view不能直接获取到,它分为lockedView、normalView,在进行滚动时,要两个view都进行滚动,否则会出现表格错位的现象哦~~,知道这点以后,其他设置就和上面的一直了!

问题1完毕!

上一篇: 总结关于色系注意点

下一篇: