LiveSearchGridPanel ExtJS 的 FiltersFeature 上的“无法调用未定义的方法 'getColumns'”
Posted
技术标签:
【中文标题】LiveSearchGridPanel ExtJS 的 FiltersFeature 上的“无法调用未定义的方法 \'getColumns\'”【英文标题】:"Cannot call method 'getColumns' of undefined " on FiltersFeature of LiveSearchGridPanel ExtJSLiveSearchGridPanel ExtJS 的 FiltersFeature 上的“无法调用未定义的方法 'getColumns'” 【发布时间】:2013-07-22 18:05:39 【问题描述】:我得到未捕获的类型错误:在 ExtJS 上单击 Live Serach 网格面板的标题工具栏时,无法调用未定义的方法 'getColumns'。我正在使用过滤器功能实现过滤器。
这是我的一些代码:
Ext.require([
'Ext.grid.*',
'Ext.ux.grid.FiltersFeature',
'Ext.ux.LiveSearchGridPanel'
...
]);
var filters =
ftype: 'filters',
encode: false,
local: true
;
var grid = new Ext.create('Ext.ux.LiveSearchGridPanel',
selType: 'cellmodel',
store: store,
columns:[
header: "Evento",
width: 90,
sortable: true,
filterable: true,
dataIndex: 'RH_DESCRIPCION',
filter:
type: 'string'
],
features: [filters]
...
这是发生异常的代码块:
Ext.Array.each(grid.columnManager.getColumns(), function (column)
//Uncaught TypeError: Cannot call method 'getColumns' of undefined
if (column.filterable === false)
filters.removeAtKey(column.dataIndex);
else
add(column.dataIndex, column.filter, column.filterable);
);
如有任何帮助,将不胜感激!
【问题讨论】:
【参考方案1】:在进行了较重的调试之后,似乎 grid.columnManager
在 4.2 版上没有得到很好的支持。对于任何其他有相同问题的人,您应该使用:
grid.down('headercontainer').getGridColumns();
或
grid.down('headercontainer').getVisibleGridColumns();
获取网格上的列。我相信这不适用于分组列,但我还没有测试过。
【讨论】:
获取所有列,包括分组和隐藏使用-grid.down('headercontainer').getHideableColumns();【参考方案2】:Ext.Array.each(grid.columnManager.getColumns(), function (column) ...
改成
Ext.Array.each(grid.columns, function (column)
效果很好:)
【讨论】:
在 ExtJS 4.2.1 columnManager.getColumns() 忽略隐藏列。 ColumnManager 也是一个私有类。我强烈建议不要使用这种方法。请改用 myGrid.query('gridcolumn')。【参考方案3】:grid.columns 不是受支持的/公共属性。例如,它可能不包含使用重新配置添加的列。如果您使用 4.2.0,它将包含它们,但不包含在 4.2.1/4.2.2 中。即使您添加 Ext.selection.CheckboxModel 也会发生这种情况,复选框列将不会包含在 4.2.2 中,如果您从 cellClick 事件中获取索引,最终会出现“索引不匹配”。
不幸的是,grid.columnManager 或 grid.getColumnManager() 在 4.2.1/4.2.2 中是新的,它是一个私有属性/方法。简而言之,其中任何一个都可能停止与 ExtJS 的下一个版本一起使用,并且“列”属性在所有情况下都不是可靠的。
在此处查看一些讨论: http://www.sencha.com/forum/showthread.php?277525
我还没有找到任何官方支持的解决方案。我无法添加 cmets,所以我不得不将其作为完整答案发布,谢谢 S.O.!
【讨论】:
【参考方案4】:正如其他人已经发布的那样,您不应使用columnManager
属性。查看 Sencha 的相关说明:
http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.grid.ColumnManager
这是供框架内部使用的私有实用程序类。 不要依赖它的存在。
我认为最好的选择是对所有列都使用它:
grid.headerCt.getGridColumns()
如果你只需要可见的列的话:
grid.headerCt.getVisibleGridColumns()
【讨论】:
以上是关于LiveSearchGridPanel ExtJS 的 FiltersFeature 上的“无法调用未定义的方法 'getColumns'”的主要内容,如果未能解决你的问题,请参考以下文章