ExtJS Grid获取选中记录报错Uncaught TypeError: grid.getSelectionModel is not a function的解决方法
解决ExtJS中
grid.getSelectionModel is not a function错误的方法 你踩的这个坑其实很典型——咱们先把问题根因说透:this.getMeasuries()拿到的是整个Window组件(毕竟你的alias: 'widget.measuries'绑定的是Ext.window.Window),而getSelectionModel()是Grid组件独有的方法,Window当然没有这个方法,所以报错是必然的。
下面给你几个靠谱的解决方案,选一个适合你的就行:
方案1:从Window中直接查找内部Grid
这是最快的修改方式,不需要改动视图代码,只调整控制器逻辑:
editMeasuries: function() { // 先拿到Window组件 var measuriesWindow = this.getMeasuries(); // 通过down()方法查找Window内的Grid组件 var grid = measuriesWindow.down('grid'); console.log(grid); // 先判断Grid是否存在,避免空指针 if(grid){ var rec = grid.getSelectionModel().getLastSelected(); if ( rec ) { var view = Ext.widget( 'measuries-edit' ); view.down( 'form' ).loadRecord( rec ); } } },
如果想更精准(比如Window里有多个Grid的情况),可以给视图里的Grid加个itemId:
// 视图中的Grid配置新增itemId xtype: 'grid', itemId: 'measuriesGrid', // ...其他配置不变
然后控制器里改成var grid = measuriesWindow.down('#measuriesGrid');,这样就不会找错Grid了。
方案2:给Grid配置合法别名,直接获取
你之前给Grid设别名报错,是因为格式不对——ExtJS的widget别名必须以widget.开头。修改视图里的Grid配置:
xtype: 'grid', alias: 'widget.measuries-grid', // 正确的别名格式 // ...其他配置不变
然后控制器里可以通过Window来查找这个别名对应的组件:
editMeasuries: function() { var measuriesWindow = this.getMeasuries(); var grid = measuriesWindow.down('widget.measuries-grid'); // 后续逻辑和方案1一致 },
方案3:用Reference关联Grid(推荐)
这是ExtJS MVC模式下更规范的做法,给Grid加reference属性:
// 视图中的Grid配置 xtype: 'grid', reference: 'measuriesGrid', // ...其他配置不变
然后控制器里用lookupReference直接获取Grid:
editMeasuries: function() { var grid = this.lookupReference('measuriesGrid'); console.log(grid); if(grid){ var rec = grid.getSelectionModel().getLastSelected(); if ( rec ) { var view = Ext.widget( 'measuries-edit' ); view.down( 'form' ).loadRecord( rec ); } } },
这种方式更符合ExtJS的组件引用规范,维护起来也更清晰。
不管选哪种方案,核心都是确保你调用getSelectionModel()的对象是Grid组件,而不是它的父容器Window。
内容的提问来源于stack exchange,提问作者ajt86
相关产品推荐
相关产品推荐

