2011-11-03 5 views
6

Pour filtrer une colonne de la grille, nous pouvons utiliser:Comment filtrer plusieurs colonnes de grille extjs?

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

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

    }     
} 

mais comment rechercher plusieurs champs à la fois, quelque chose comme:

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

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

} 

des idées?

EDIT:

La chose étrange est que dans les deux cas, seule recherche unique fonctionne:

Cela fonctionne:

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

et cela fonctionne:

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

store.filter(FirstNameFilter); 

mais ce n'est pas:

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

ou fait ceci:

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

Répondre

8

Essayez de créer des instances de Ext.util.Filter comme ceci:

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

Vous pouvez créer seul filtre avec une logique personnalisée:

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

J'ai édité la question, des idées? –

+0

Non seulement l'OP at-il mentionné que cela ne fonctionne pas mais j'utilise 3.2 (être obligé de le faire) et Ext.util.Filter n'existe pas. Aucune suggestion? –

+0

bonjour ce filtre de code vérifie à la fois le champ si les deux sont disponibles puis retourne le résultat –

2

Cela devrait fonctionner. N'est-ce pas? Si je comprends bien, si vous appliquez des filtres comme vous l'avez montré, il devrait filtrer selon les deux critères. En alternative, vous devriez pouvoir utiliser la fonction setFilter pour ajouter de nouveaux filtres. Si vous utilisez setFilter sans argument, il suffit de réappliquer les filtres que vous avez définis précédemment. Ils ne sont supprimés que si vous appelez clearFilter.

+0

Lequel a filtré, prénom ou nom? – svenlol

+0

bien, aucun si vous mettez les deux filtres, ne fonctionne qu'avec un, je dois dire, filtre json entier pour searchValue, donc j'ai besoin de plusieurs filtres sur plusieurs colonnes? –

8

J'ai trouvé ce poste lors de la recherche d'un moyen de filtrer plusieurs colonnes (en réalité TOUTES les colonnes) avec la logique OU. (Donc la recherche article correspond à la colonne A OU correspond à la colonne B, etc.) J'ai fini par filtrer avec un filterFunction personnalisé comme:

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

Ceci est mon code qui applique de Pavel.
Pour mon travail qui recherche Multi-colonne, non sensible à la casse, Ignore position par OR logique.

Espérons cette aide.

Questions connexes