1

当我尝试动态设置网格过滤器列表时,我遇到了一个奇怪的问题。

让我通过我的代码片段来解释

我有一列过滤器列表定义为

         { 
            text        : 'Client',
            dataIndex   : 'topAccount', 
            itemId  : 'exTopAccount',

            filter: {
                       type: 'list',
                       options:[]

                    }
        }

我在“viewready”中从商店初始化列表

 viewready: function(cmp,eOpts){

                    cmp.getHeaderCt().child('#exTopAccount').initialConfig.filter.options = clientsStore.collect('topAccount');
            }

===> 效果很好

现在,当用户移动到下一页时,我必须根据记录构建新的客户端商店。因此,我在分页的“更改”事件中建立商店

listeners: {
               'change' :function( toolbar, pageData, eOpts ) { 
                   var store = Ext.StoreManager.get('ExceptionRecords');
                   clientsStore.removeAll(true);
                    store.each(function(record){                           
                         if(clientsStore.findRecord('topAccount',record.data.topAccount.trim()) == null ) {                                 
                            clientsStore.add({topAccount: record.data.topAccount.trim()})
                         }
                    })      
                    Ext.getCmp('exceptionGridContainer').view.refresh;
                    Ext.getCmp('exceptionGridContainer').view.getHeaderCt().doLayout;


                    console.log(clientsStore);
                    Ext.getCmp('exceptionGridContainer').view.getHeaderCt().child('#exTopAccount').initialConfig.filter.options = clientsStore.collect('topAccount');



                } 
           } 

我现在可以在 clientsStore 中看到新数据。但是网格过滤器列表没有更新。仍然显示旧数据。我尝试了刷新、布局等。没有什么帮助

任何帮助将不胜感激

谢谢塔拉汉

4

2 回答 2

2

仅更改属性的值不会影响组件的渲染或计算状态。首次初始化列表时会创建菜单。第一次这样做时,它可以工作,因为那是在初始化之前,但第二次,那就太晚了。

如果您可以获取对实例化的引用ListFilter,我认为您可以通过这种方式强制重新创建菜单:

listFilter.menu = listFilter.createMenu({
    options: [ ... ] // new options
    // rest of the filter config
});

因此,假设您有对 target 的引用,您可以通过类似于以下的调用grid更改带有“topAccount”的列的选项:dataIndex

var listFilter = grid
    .findFeature('filters') // access filters feature of the grid
    .get('topAccount'); // access the filter for column
listFilter.menu = listFilter.createMenu({
    options: [ ... ] // new options
    // rest of the filter config
});

- - 编辑 - -

好的,完整的例子。测试,工作

Ext.widget('grid', {
    renderTo: Ext.getBody()

    ,height: 400

    ,features: [{
        ftype: 'filters'
        ,local: true
    }]

    ,columns: [{
        dataIndex: 'a'
        ,text: 'Column A'
        ,filter: {
            type: 'list'
            ,options: ['Foo', 'Bar']
        }
    },{
        dataIndex: 'b'
        ,text: 'Column B'
    },{
        dataIndex: 'c'
        ,text: 'Column C'
    }]

    ,store: {
        fields: ['a', 'b', 'c']
        ,autoLoad: true
        ,proxy: {
            type: 'memory'
            ,reader: 'array'
            ,data: [
                ['Foo', 1, 'Bar']
                ,['Bar', 2, 'Baz']
                ,['Baz', 1, 'Bar']
                ,['Bat', 2, 'Baz']
            ]
        }
    }

    ,tbar: [{
        text: 'Change list options'
        ,handler: function() {
            var grid = this.up('grid'),
                // forget about getFeature, I read the doc and found something!
                filterFeature = grid.filters,
                colAFilter = filterFeature.getFilter('a');

            // If the filter has never been used, it won't be available            
            if (!colAFilter) {
                // someone commented that this is the way to initialize filter
                filterFeature.view.headerCt.getMenu();
                colAFilter = filterFeature.getFilter('a');
            }

            // ok, we've got the ref, now let's try to recreate the menu
            colAFilter.menu = colAFilter.createMenu({
                options: ['Baz', 'Bat']
            });
        }
    }]
});
于 2013-06-05T16:15:07.920 回答
0

我正在解决类似的问题,这个问题的答案对我帮助很大。本地列表过滤器菜单实际上是延迟加载的(仅在单击时创建),如果网格存储已用不同的数据重新加载,我需要将过滤器菜单设置为重新加载。通过在每次重新加载后破坏菜单来解决它,因此在下一次单击菜单时重新创建:

var on_load = function() {
  var grid_header = me.gridPanel.filters.view.headerCt

  if (grid_header.menu) {
    grid_header.menu.destroy();
    grid_header.menu = null;  
  }
}
于 2016-01-18T18:01:56.960 回答