Как отфильтровать несколько столбцов сетки extjs? - PullRequest
7 голосов
/ 03 ноября 2011

Для фильтрации одного столбца сетки мы можем использовать:

{
     xtype: 'button',
     text:'Search',
     handler:function(){

        store.clearFilter();
        var searchValue = Ext.getCmp("textFieldId").getValue();
        store.load().filter('GridFieldName', searchValue);

     }                   
}

но как искать несколько полей одновременно, что-то вроде:

{
    xtype: 'button',
    text:'Search',
    handler:function(){

        store.clearFilter();
        var searchValue = Ext.getCmp("textFieldId").getValue();
        store.filter([
           {property: "GridFieldName", value: searchValue},
           {property: "GridFieldName1", value: searchValue}
        ]);
    }                   

}

есть идеи?

EDIT:

Странно то, что в обоих случаях работает только один поиск:

Это работает:

store.filter([
      { property: "FirstName", value: searchValue }
]);

и это работает:

var FirstNameFilter = new Ext.util.Filter({
   property: "FirstName", value: searchValue
});

store.filter(FirstNameFilter);

но это не так:

store.filter([
      { property: "FirstName", value: searchValue },
      { property: "LastName", value: searchValue }
]); 

или делает это:

 var filters = [
     new Ext.util.Filter({
          property: "FirstName", value: searchValue
     }),
     new Ext.util.Filter({
          property: "LastName", value: searchValue
     })
 ];
 store.filter(filters);

Ответы [ 4 ]

9 голосов
/ 03 ноября 2011

Попробуйте создать экземпляры Ext.util.Filter, например:

var filters = [
 new Ext.util.Filter({
  property: "GridFieldName", value: searchValue
 }),
 new Ext.util.Filter({
  property: "GridFieldName1", value: searchValue
 })
];
store.filter(filters);

Кроме того, вы можете создать отдельный фильтр с пользовательской логикой:

var filters = [
     new Ext.util.Filter({
      filterFn: function(item){
         return item.get('GridFieldName') == searchValue && item.get('GridFieldName1') == searchValue;
      }
     })
];
store.filter(filters);
8 голосов
/ 30 марта 2012

Я нашел этот пост, когда искал способ фильтрации по нескольким столбцам (фактически по ВСЕМ столбцам) с помощью логики ИЛИ.(таким образом, условие поиска соответствует столбцу A ИЛИ соответствует столбцу B и т. д.) В итоге фильтрация была выполнена с помощью пользовательской функции фильтра, например:

...
var regex = RegExp('Insert searchclause here', 'i');
store.filter(new Ext.util.Filter({
    filterFn: function (object) {
        var match = false;
        Ext.Object.each(object.data, function (property, value) {
            match = match || regex.test(String(value));
        });
        return match;
      }
}));

HTH

4 голосов
/ 22 мая 2013
    store.clearFilter();
    var searchValue = Ext.getCmp("textFieldId").getValue();
    if (!!searchValue) {
        var filters = [
             new Ext.util.Filter({
                 filterFn: function (item) {
                     return item.get('FirstName').toLowerCase().indexOf(searchValue.toLowerCase()) > -1                                 
                         || item.get('LastName').toLowerCase().indexOf(searchValue.toLowerCase()) > -1;
                 }
             })
        ];
        store.filter(filters);
    }

Это мой код, который применяется от Павла.
Для моей работы, которая ищет Много столбец, Не чувствителен к регистру, Пропускать позицию по OR логика.

Надеюсь, что это поможет.

2 голосов
/ 03 ноября 2011

Это должно работать.Это не?Как я понимаю, если вы применяете фильтры, как вы показали, он должен фильтровать по обоим критериям.

store.filter([
   {property: "GridFieldName", value: searchValue},
   {property: "GridFieldName1", value: searchValue}
]);

В качестве альтернативы вы можете использовать функцию setFilter для добавления новых фильтров.

store.setFilter("GridFieldName",  searchValue)
store.setFilter("GridFieldName1",  searchValue)

Если вы используете setFilter без аргументов, он должен просто повторно применить фильтры, которые вы определили ранее.Они удаляются только при вызове clearFilter.

...