当我尝试动态设置网格过滤器列表时,我遇到了一个奇怪的问题。
让我通过我的代码片段解释
我有一个带有过滤器列表的列定义为
{
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
答案 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;
}
}