Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法


Posted in Javascript onAugust 15, 2014

Ext4.2+ Ext.grid.plugin.RowExpander存在bug,添加的collapsebody,expandbody无法触发,查看了下 Ext.grid.plugin.RowExpander对应的源代码,没有添加collapsebody,expandbody事件,即使按照网上的方 法重写Ext.grid.plugin.RowExpander的init和toggleRow方法也无法触发 collapsebody,expandbody事件。

解决办法:给grid对象添加collapsebody,expandbody事件,然后给grid配置这2个事件,同时重写Ext.grid.plugin.RowExpander的toggleRow方法,触发grid添加的这2个事件即可。

测试源代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Ext4.2+ Ext.grid.plugin.RowExpander无法触发collapsebody,expandbody事件解决办法</title>
<link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" rel="external nofollow" />
<script type="text/javascript" src="../../ext-all-debug.js"> </script>
<script>
Ext.override(Ext.grid.plugin.RowExpander, { // Override to fire collapsebody & expandbody
 init: function(grid) {
  this.callParent(arguments);
//  grid.getView().addEvents('collapsebody', 'expandbody');//ext论坛找到的解决办法,这样也无法添加事件
//存储grid对象
this.grid=grid
  this.grid.addEvents('collapsebody', 'expandbody');//给grid对象添加事件
 },
 toggleRow: function(rowIdx, record) {
  var me = this,
   view = me.view,
   rowNode = view.getNode(rowIdx),
   row = Ext.fly(rowNode, '_rowExpander'),
   nextBd = row.down(me.rowBodyTrSelector, true),
   isCollapsed = row.hasCls(me.rowCollapsedCls),
   addOrRemoveCls = isCollapsed ? 'removeCls' : 'addCls',
   ownerLock, rowHeight, fireView;
 
 
  // Suspend layouts because of possible TWO views having their height change
  Ext.suspendLayouts();
  row[addOrRemoveCls](me.rowCollapsedCls);
  Ext.fly(nextBd)[addOrRemoveCls](me.rowBodyHiddenCls);
  me.recordsExpanded[record.internalId] = isCollapsed;
  view.refreshSize();
 
 
  // Sync the height and class of the row on the locked side
  if (me.grid.ownerLockable) {
   ownerLock = me.grid.ownerLockable;
//   fireView = ownerLock.getView();
   view = ownerLock.lockedGrid.view;
   fireView=ownerLock.lockedGrid.view;
   rowHeight = row.getHeight();
   // EXTJSIV-9848: in Firefox the offsetHeight of a row may not match
   // it is actual rendered height due to sub-pixel rounding errors. To ensure
   // the rows heights on both sides of the grid are the same, we have to set
   // them both.
   row.setHeight(isCollapsed ? rowHeight : '');
   row = Ext.fly(view.getNode(rowIdx), '_rowExpander');
   row.setHeight(isCollapsed ? rowHeight : '');
   row[addOrRemoveCls](me.rowCollapsedCls);
   view.refreshSize();
  } else {
   fireView = view;
  }
//通过grid触发事件,而不是view
this.grid.fireEvent(isCollapsed ? 'expandbody' : 'collapsebody', row.dom, record, nextBd);
//下面为ext论坛的解决办法,无效
//fireView.fireEvent(isCollapsed ? 'expandbody' : 'collapsebody', row.dom, record, nextBd);
  // Coalesce laying out due to view size changes
  Ext.resumeLayouts(true);
 },
});
//Ext.loader.setConfig({enabled:true});
Ext.onReady(function() {
 Ext.QuickTips.init();
 var store = new Ext.data.Store({
   
  fields:[
   {name:'fileName',type:'string'},
   {name:'room',type:'string'},
   {name:'recordDate',type:'string'},
   
  ],
  data:[
   {fileName:'文件1',room:'会议室1',recordDate:'2014-07-03'},
   {fileName:'文件2',room:'会议室2',recordDate:'2014-07-03'},
   {fileName:'文件3',room:'会议室3',recordDate:'2014-07-03'}
  ],
  autoLoad:true
 });
 var expander = new Ext.grid.plugin.RowExpander({
  rowBodyTpl:new Ext.XTemplate('<div class="detailData">pp</div>'),
  listeners:{
   expandbody:function(){//无法触发这个是事件
    console.log('Ext.grid.plugin.RowExpander');
   }
  }
 });
  Ext.create('Ext.grid.Panel',{
  xtype: 'row-expander-grid',
  store: store,
  listeners:{
   expandbody:function(){//OK,可以触发
    console.log('fired from grid');
   }
  },
  renderTo:Ext.getBody(),
  columns: [
   {text: "文件名称", flex: 1, dataIndex: 'fileName'},
   {text: "会议室", dataIndex: 'room'},
   {text: "录制日期", renderer: Ext.util.Format.dateRenderer('Y-m-d'), dataIndex: 'recordDate'}
  ],
  width: 600,
  height: 300,
  plugins:expander,
  collapsible: true,
  animCollapse: false,
  title: 'Expander Rows in a Collapsible Grid',
  iconCls: 'icon-grid'
 });
});
</script>
</head>
<body id="docbody">
</body>
</html>

Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法

Javascript 相关文章推荐
JavaScript 继承详解(一)
Jul 13 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
Mar 15 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
jQuery获取iframe的document对象的方法
Oct 10 Javascript
jQuery 3.0 的变化及使用方法
Feb 01 Javascript
js调用屏幕宽度的简单方法
Nov 14 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
Jun 19 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
Aug 28 Javascript
Vue三层嵌套路由的示例代码
May 05 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
Nov 27 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
Dec 04 jQuery
JS高阶函数原理与用法实例分析
Jan 15 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
Aug 15 #Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 #Javascript
js创建表单元素并使用submit进行提交
Aug 14 #Javascript
使用typeof判断function是否存在于上下文
Aug 14 #Javascript
java、javascript实现附件下载示例
Aug 14 #Javascript
js怎么判断flash swf文件是否加载完毕
Aug 14 #Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
Aug 14 #Javascript
You might like
PHP中ADODB类详解
2008/03/25 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
了解Javascript的模块化开发
2015/03/02 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
浅谈Python 的枚举 Enum
2017/06/12 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
美国爆米花工厂:The Popcorn Factory
2019/09/14 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
大学生优秀的自我评价分享
2013/10/22 职场文书
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
说明书范文
2014/05/07 职场文书
企业文化演讲稿
2014/05/20 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
民间借贷协议书范本
2014/10/01 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书