2011-11-03 16 views
6

Aby filtrować jedną kolumnę siatki możemy użyć:Jak filtrować wiele kolumn siatki extjs?

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

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

    }     
} 

ale jak szukać wielu pól jednocześnie, coś takiego:

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

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

} 

jakieś pomysły?

EDIT:

dziwne jest to, że w obu przypadkach tylko pojedyncze wyszukiwania działa:

to działa:

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

i to działa:

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

store.filter(FirstNameFilter); 

, ale nie ma to znaczenia:

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

lub robi to:

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

Odpowiedz

8

próby utworzenia instancji Ext.util.Filter tak:

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

Alternatywnie, można utworzyć pojedynczy filtr z niestandardowego logiki:

var filters = [ 
    new Ext.util.Filter({ 
     filterFn: function(item){ 
     return item.get('GridFieldName') == searchValue && item.get('GridFieldName1') == searchValue; 
     } 
    }) 
]; 
store.filter(filters); 
+0

Edytowałem pytanie, jakieś pomysły? –

+0

Nie tylko OP oświadczył, że to nie działa, ale używam 3.2 (zmuszony do) i Ext.util.Filter nie istnieje. Jakieś sugestie? –

+0

witam ten filtr kodu sprawdź oba pola, jeśli oba są dostępne, a następnie zwróć wynik –

2

To powinno działać. Czy nie jest? Jak rozumiem, jeśli zastosujesz filtry, tak jak to pokazałeś, powinien filtrować według obu kryteriów.

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

Jako alternatywę powinieneś być w stanie korzystać z funkcji setFilter aby dodać nowe filtry.

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

Jeśli użyjesz setFilter bez argumentów, powinieneś ponownie zastosować filtry, które wcześniej zdefiniowałeś. Są one usuwane tylko wtedy, gdy wywołasz clearFilter.

+0

Który filtrowany, firstName lub LastName? – svenlol

+0

cóż, żaden, jeśli wstawisz oba filtry, działa tylko z jednym, muszę powiedzieć, filtrować cały json dla searchValue, więc potrzebuję wielu filtrów na wielu kolumnach? –

8

znalazłem ten post w poszukiwaniu sposobu, aby filtrować wiele kolumn (właściwie wszystkie kolumny) z logiką OR. (A więc search-klauzula mecze mecze kolumny A lub kolumny B itp) skończyło się filtrując z niestandardowym filterfunction jak:

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

To jest mój kod, który stosuje się od Pawła.
Dla mojej pracy, która wyszukuje Wielokolumnowa, bez rozróżniania wielkości liter, Ignoruj ​​pozycję według logiki .

Mam nadzieję, że ta pomoc.

Powiązane problemy