解决exjtjs3.3中gridpanel中动态加载列时使用selModel无效的问题
2012-05-07 15:34
471 查看
创建GridPanel
动态列代码
当点击行的checkbox的时候,Firebug会报错
this.grid is undefined
是上面这段代码报错,这段代码出自源码Ext.grid.RowSelectionModel文件
原因:是动态列代码中的第10行红色部分的CheckboxSelectionModel在动态列中没有绑定对应的grid
将上述代码修改成
以为这样就解决问题了,再次点击也可以选中行了,也没报错了。
但是在删除时,使用getSelections()方法返回的总是空数组,致使无法删除选中的记录。
在设置断点调试,发现各种相关的对象都能拿到,唯独没有选中的记录,百思不得其解,Google之,无果。
后仔细观察代码,总算找到原因了,其实很简单。
原因还是出在修改的代码上面,我原有的GridPanel已经设置了selModel,在动态列的代码中又new了一个CheckboxSelectionModel绑定在上面,当使用grid.getSelectionModel()拿到的引用还是原来的sm,而不是new出来的那个。[b](这里比较奇怪,没有覆盖掉原来的sm么?)[/b]
现在只能这样理解,反正问题解决了,只要拿到原有的selModel就行了。
将红色代码修改如下:
_createGridPanel : function(){ var sm = new Ext.grid.CheckboxSelectionModel(); sm.handleMouseDown = Ext.emptyFn; var Host = Ext.data.Record.create([ {name: 'isAgentOk', mapping: 'isAgentOk',type :'boolean'}, {name: 'ip', mapping: 'ip'} ]); var proxy = new Ext.data.PagingMemoryProxy(this.hosts.sort(function(a,b){ return a.isAgentOk===true ? 1 : -1; })); var reader = new Ext.data.JsonReader({ totalProperty: 'totalProperty', root: 'rows' },Host); var store = new Ext.data.Store({ reader :reader, proxy : proxy }); var cm = new Ext.grid.ColumnModel({ defaults : { sortable : false, align : 'left', menuDisabled : true }, columns :[ sm,{ header : "agent状态", dataIndex : 'isAgentOk', renderer: function(value, metaData, record) { metaData.css = "bold"; return value===true ? '正常' : '异常'; } }, { header : "JobIP", dataIndex : 'ip', renderer: function(value, metaData, record) { metaData.css = "bold"; return value; } }] }); var gridPanel = new Ext.grid.GridPanel({ id : this.id + '_HostGridPanel', name : this.id + '_HostGridPanel', headerCfg : { tag : 'div', html : '<span id="'+this.id+'_spanIPInfo">本次导入[<label style="color:#FF0000;"> 0 </label>]个IP, 共计导入[<label style="color:#FF0000;"> 0 </label>]个IP;agent检测状态异常的IP数量共计[<label style="color:#FF0000;"> 0 </label>];</span>', style : 'font-family:Tahoma,Arial,Helvetica,sans-serif;font-size:15px;transparent;border-bottom:1px solid #99BBE8;' }, autoHeight : true, autoScroll : true, stripeRows : true, loadMask : { msg :'正在加载数据,请稍等…' }, viewConfig : { forceFit : true, getRowClass : function(record, rowIndex, rp, ds){ var rowClass = ''; rowClass = record.data.isAgentOk !== true ? 'x-grid-row-ip-agent-fail' : ''; return rowClass; } }, sm : sm, cm : cm, store : store, columnLines: true, bbar: new Ext.PagingToolbar({ pageSize: this.pageSize, store: store, displayInfo: true, beforePageText : '页', afterPageText : '/ {0}', displayMsg: "显示第 {0} 条到 {1} 条记录,一共 {2} 条", emptyMsg: "没有记录" }), buttonAlign: "center", buttons: [{ text: "复制IP", icon: "./images/add.gif", ref : '../btnCopy', scope: this, value: 2 },{ text: "删除选中", icon: "./images/set.jpg", ref : '../btnDelete', scope: this },{ text: "清空", icon: "./images/set.jpg", ref : '../btnClear', scope: this },{ text: "刷新agent状态", icon: "./images/set.jpg", ref : '../btnRefreshAgnet', scope: this }] }); return gridPanel; }
动态列代码
_reconfigure : function(grid){ var cm = []; var fields = []; Ext.each(this.hosts,function(host){ if(!Ext.isObject(host.params)){ host.params = {}; } }); //固定列 10 var sm = new Ext.grid.CheckboxSelectionModel({ 11 handleMouseDown : Ext.emptyFn 12 }); cm = [ sm, {header: "Agent状态", dataIndex: "isAgentOk", sortable: false, renderer: function(value, metaData, record) { metaData.css = "bold"; return value===true ? '正常' : '异常'; } }, {header: "JobIP", dataIndex: "ip", sortable: false, renderer: function(value, metaData, record) { metaData.css = "bold"; return value; } } ]; fields = [ {name: 'isAgentOk', mapping: 'isAgentOk',type :'boolean'}, {name: 'ip', mapping: 'ip'} ]; //动态列 if(this.hosts.length>0){ var params = this.hosts[0].params; if(Ext.isObject(params)){ for (var key in params) { cm.push({ header: key, sortable: false, dataIndex: key }); fields.push({ name : key, mapping : 'params["' + key + '"]' }); this.MAPPING_FIELDS.params = {}; this.MAPPING_FIELDS.params[key] = ''; } } } var colModel = new Ext.grid.ColumnModel({ defaults : { sortable : false, align : 'left', menuDisabled : true }, columns : cm }); var Host = Ext.data.Record.create(fields); var proxy = new Ext.data.PagingMemoryProxy(this.hosts.sort(function(a,b){ return a.isAgentOk===true ? 1 : -1; })); var reader = new Ext.data.JsonReader({ totalProperty: 'totalProperty', root: 'rows' },Host); var store = new Ext.data.Store({ reader :reader, proxy : proxy }); store.on('beforeload',this._onHostGridBeforeload,this); grid.reconfigure(store,colModel); grid.getBottomToolbar().bind(store); store.load({params:{start : 0,limit : this.pageSize}}); }
当点击行的checkbox的时候,Firebug会报错
this.grid is undefined
isSelected : function(index){ var r = Ext.isNumber(index) ? this.grid.store.getAt(index) : index; return (r && this.selections.key(r.id) ? true : false); },
是上面这段代码报错,这段代码出自源码Ext.grid.RowSelectionModel文件
原因:是动态列代码中的第10行红色部分的CheckboxSelectionModel在动态列中没有绑定对应的grid
将上述代码修改成
var sm = new Ext.grid.CheckboxSelectionModel({ grid:grid, handleMouseDown : Ext.emptyFn });
以为这样就解决问题了,再次点击也可以选中行了,也没报错了。
但是在删除时,使用getSelections()方法返回的总是空数组,致使无法删除选中的记录。
在设置断点调试,发现各种相关的对象都能拿到,唯独没有选中的记录,百思不得其解,Google之,无果。
后仔细观察代码,总算找到原因了,其实很简单。
原因还是出在修改的代码上面,我原有的GridPanel已经设置了selModel,在动态列的代码中又new了一个CheckboxSelectionModel绑定在上面,当使用grid.getSelectionModel()拿到的引用还是原来的sm,而不是new出来的那个。[b](这里比较奇怪,没有覆盖掉原来的sm么?)[/b]
现在只能这样理解,反正问题解决了,只要拿到原有的selModel就行了。
将红色代码修改如下:
var sm = grid.getSelectionModel();
相关文章推荐
- 解决使用AJax往DropDownList中动态添加数据时发生,回发或回调参数无效 的问题
- 使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
- Asp.net开发心得点滴[动态加载的用户控件使用事件委托,交给页面处理的事件无效问题]
- struts2.5 使用感叹号和通配符实现动态方法调用无效的问题及解决!
- 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题
- struts2.5 使用感叹号和通配符实现动态方法调用无效的问题及解决!
- 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题
- 使用.live()可以解决动态加载html,但js无效果的问题
- 使用jquery的load方法设计动态加载,并解决浏览器前进、后退、刷新等问题
- 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题
- 使用泛型解决需要动态返回类型的问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- Ext界面做图片动态加载的图片放大镜效果并解决JS内存泄漏问题
- 使用eclipse创建多文件java工程出现找不到或无法加载主类问题解决
- 使用连接查询解决一对一实体关联查询时的懒加载问题
- Android使用BitmapFactory.Options解决加载大图片内存溢出问题
- 使用Redirector插件解决googleapis公共库加载的问题【转】
- Android使用Glide加载Gif.解决Glide加载Gif非常慢问题
- 解决使用SpringMVC时,css、js、image等静态资源无法加载的问题
- struts2 感叹号动态加载方法配置(问题解决了)