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'”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Extjs CMD 应用程序中使用 ux 组件?

livesearchgridpanel上的分页工具栏问题

ExtJs 入门教程

Extjs 3 到 Extjs 4 [关闭]

ExtJS:以 ExtJS 样式获取当前 URL

ExtJs3 中的 Extjs4 this.callParent