无法过滤多个 extjs 网格列

Posted

技术标签:

【中文标题】无法过滤多个 extjs 网格列【英文标题】:Can't filter multiple extjs grid columns 【发布时间】:2012-11-20 16:55:26 【问题描述】:

要过滤我使用的一个网格列:

store.filter(
          property: 'first_name',
          anyMatch: true,
          value   : this.getValue()
      );

现在我需要一次搜索多个字段,例如:

      var filters = [
    new Ext.util.Filter(
    property: "first_name", anyMatch: true, value: this.getValue()
    ),
    new Ext.util.Filter(
   property: "last_name", anyMatch: true, value: this.getValue()
   )
 ];
  store.filter(filters);

奇怪的是,在这两种情况下,只有单一搜索有效

这没有帮助How to filter multiple extjs grid columns?

【问题讨论】:

【参考方案1】:

根据您实现过滤器的方式,我猜您正在使用remoteSort: false 作为提示:您不需要创建过滤器的实例,只需提供配置即可。如果可能的话备用this。大多数事件提供组件的实例,使用它而不是this。它可以让你头疼。

我测试了它并且它有效。这是一个简单的例子:

Ext.create('Ext.data.Store', 
    storeId:'simpsonsStore',
    fields:['name', 'email', 'phone'],
    data:'items':[
         'name': 'Lisa',  "email":"lisa@simpsons.com",  "phone":"555-111-1224"  ,
         'name': 'Lisam',  "email":"lisa@simpsons.com",  "phone":"555-222-1234" ,
         'name': 'Bart',  "email":"bart@simpsons.com",  "phone":"555-222-1234" ,
         'name': 'Homer', "email":"home@simpsons.com",  "phone":"555-222-1244"  ,
         'name': 'Marge', "email":"marge@simpsons.com", "phone":"555-222-1254"  
    ],
    proxy: 
        type: 'memory',
        reader: 
            type: 'json',
            root: 'items'
        
    
);

Ext.create('Ext.grid.Panel', 
    title: 'Simpsons',
    tbar: [
        text: 'filter',
        handler: function(btn) 
            var g = btn.up('grid');
            g.store.filter([property: "name", anyMatch: true, value: 'Lisa',property: "email", anyMatch: true, value: 'lisa@simpsons.com'])
        
    ],
    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    columns: [
         text: 'Name',  dataIndex: 'name' ,
         text: 'Email', dataIndex: 'email', flex: 1 ,
         text: 'Phone', dataIndex: 'phone' 
    ],
    height: 200,
    width: 400,
    renderTo: Ext.getBody()
);

这是一个JSFiddle

第 2 版 带有文本字段

Ext.create('Ext.data.Store', 
    storeId:'simpsonsStore',
    fields:['name', 'email', 'phone'],
    data:'items':[
         'name': 'Lisa',  "email":"lisa@simpsons.com",  "phone":"555-111-1224"  ,
         'name': 'Lisam',  "email":"lisa@simpsons.com",  "phone":"555-222-1234" ,
         'name': 'Bart',  "email":"bart@simpsons.com",  "phone":"555-222-1234" ,
         'name': 'Homer', "email":"home@simpsons.com",  "phone":"555-222-1244"  ,
         'name': 'Marge', "email":"marge@simpsons.com", "phone":"555-222-1254"  
    ],
    proxy: 
        type: 'memory',
        reader: 
            type: 'json',
            root: 'items'
        
    
);

Ext.create('Ext.grid.Panel', 
    title: 'Simpsons',
    tbar: [
        xtype: 'textfield',
        emptyText: 'filter',
        listeners: 
            specialkey: function(field, e)
                if (e.getKey() == e.ENTER) 
                    var g = field.up('grid'),
                        value = field.getValue(); 
                    g.store.filter(scope: this, filterFn: function(rec)  
                    var rege = new RegExp(".*" + value + ".*"); 
                    if (rege.test(rec.data.name) || rege.test(rec.data.email)) 
                        return true;
                    
                    return false;
                 
            );
                
            
        
    ],
    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    columns: [
         text: 'Name',  dataIndex: 'name' ,
         text: 'Email', dataIndex: 'email', flex: 1 ,
         text: 'Phone', dataIndex: 'phone' 
    ],
    height: 200,
    width: 400,
    renderTo: Ext.getBody()
);​

还有 JSFiddle

【讨论】:

好的,当我使用 :store.filter([property: "first_name", anyMatch: true, value: this.getValue(),property: "last_name", anyMatch: true, value: this.getValue()]); 时,它可以工作,但作为 AND 条件,例如当用户键入“ma”时......名字。我需要它是或。我怎样才能做到这一点 ?非常感谢。 @Noon 您必须为此编写自定义 filterFn,因为过滤器始终与 AND 连接。一有时间我会更新我的帖子 @Noon 查看我的编辑,现在也使用文本字段(点击返回搜索) 太棒了!现在我只需要 OR 条件 @Noon 它已经在那里了。看; if (rege.test(rec.data.name) || rege.test(rec.data.email)) 测试组合为OR,因此只需满足一个条件,您就会得到结果。

以上是关于无法过滤多个 extjs 网格列的主要内容,如果未能解决你的问题,请参考以下文章

Ext JS:如何在具有多个列值的网格中查找记录

应用过滤器后在 Extjs 网格列中添加过滤器图标一次

如何将 EXTJS 4.2.1 网格行按多个关系分组?

Extjs 4,如何使用单个 Json 文件为多个动态网格发送多个元数据

如何在 extjs 3 网格中选择行以及如何放置过滤器

ExtJS 网格面板 - 每行多个“行”?