2011-11-03 42 views
6

Para filtrar una columna de cuadrícula podemos utilizar:Cómo filtrar múltiples columnas de cuadrícula extjs?

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

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

    }     
} 

pero la forma de buscar en varios campos a la vez, algo así como:

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

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

} 

alguna idea?

EDIT:

Lo extraño es que, en ambos casos, sólo la búsqueda solo funciona:

Esto funciona:

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

y esto funciona:

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

store.filter(FirstNameFilter); 

pero esto no:

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

o hace esto:

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

Respuesta

8

intenta crear instancias de Ext.util.Filter así:

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

Como alternativa, puede crear un solo filtro con lógica personalizada:

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

edité la pregunta, alguna idea? –

+0

El OP no solo mencionó que esto no funciona, pero estoy usando 3.2 (forzado) y Ext.util.Filter no existe. ¿Alguna sugerencia? –

+0

hola este filtro de código compruebe ambos campos si ambos están disponibles entonces y luego devuelve el resultado –

2

que debería funcionar. ¿No lo es? Como entiendo si aplica filtros como lo ha mostrado, debe filtrar por ambos criterios.

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

Como alternativa, debe poder usar la función setFilter para agregar nuevos filtros.

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

Si usa setFilter sin argumentos, simplemente debe volver a aplicar los filtros que ha definido previamente. Solo se eliminan si llamas a clearFilter.

+0

¿Cuál filtro, primer nombre o apellido? – svenlol

+0

bueno, ninguno si pones ambos filtros, solo funciona con uno, necesito, digamos, filtrar todo json para searchValue, entonces ¿necesito múltiples filtros en varias columnas? –

8

me encontré con este post durante la búsqueda de una forma de filtrar el columnas múltiples (en realidad TODAS las columnas) con lógica OR. (Lo que la búsqueda cláusula coincide con la columna A o coincide con la columna B, etc.) que terminó filtrando con un filterfunction personalizado como:

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

Este es mi código que se aplican a Pavel.
Para mi trabajo que busca Multi-columna, Sin mayúsculas, Ignorar la posición por OR lógica.

Espero que esta ayuda.

Cuestiones relacionadas