Ext JS 4:网格列表过滤器未更新

时间:2013-06-05 15:32:49

标签: javascript extjs

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

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

我有一个带有过滤器列表的列定义为

         { 
            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中看到新数据。但网格过滤器列表未更新。仍然显示旧数据。我尝试过刷新,布局等。没有什么可以帮助

任何帮助将不胜感激

由于 Tharahan

2 个答案:

答案 0 :(得分:2)

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

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

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

因此,假设您有对目标grid的引用,您可以通过类似于此的调用更改“{1}}”topAccount“列的选项:

dataIndex

---编辑---

好的,完整的例子。经过测试,working

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
});

答案 1 :(得分: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;  
  }
}