J'utilise mat-table . Il a un filtre qui fonctionne bien.
Le filtre s'est passé contre les données ci-dessous (toutes les colonnes)
const ELEMENT_DATA: Element[] = [
{position: 14598, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
{position: 24220, name: 'Helium', weight: 4.0026, symbol: 'He'},
{position: 39635, name: 'Lithium', weight: 6.941, symbol: 'Li'},
{position: 42027, name: 'Beryllium', weight: 9.0122, symbol: 'Be'},
{position: 53216, name: 'Boron', weight: 10.811, symbol: 'B'},
{position: 60987, name: 'Carbon', weight: 12.0107, symbol: 'C'},
{position: 70976, name: 'Nitrogen', weight: 14.0067, symbol: 'N'},
{position: 81297, name: 'Oxygen', weight: 15.9994, symbol: 'O'},
{position: 90975, name: 'Fluorine', weight: 18.9984, symbol: 'F'},
{position: 18879, name: 'Neon', weight: 20.1797, symbol: 'Ne'},
{position: 11209, name: 'Sodium', weight: 22.9897, symbol: 'Na'}
];
Mais maintenant j'essaye de changer le filtre parce que je veux que le filtre soit juste pour la colonne "position", "name", "symbol". Je suis passé par cet exemple mais Filtrage de colonnes spécifiques dans la table Matériau angulaire dans la forme angulaire 5 . Je ne comprenais pas, aidez-moi, s'il vous plaît.
Vous devez remplacer la filterPredicate
de votre source de données.
Voici un exemple de la façon de le faire: Démo de travail
Essentiellement, vous voulez spécifier les propriétés dans les données auxquelles le filtre est appliqué:
this.dataSource.filterPredicate = function(data, filter: string): boolean {
return data.name.toLowerCase().includes(filter) || data.symbol.toLowerCase().includes(filter) || data.position.toString().includes(filter);
};
Ajout à la réponse des bugs. Voici une implémentation plus élaborée,
export class FilterTable implements AfterViewInit {
//some datasource
datasource //=
displayedColumns //=insert column names on which you want to filter whether they are displayed or not, but present in the datasource
// Apply filter to the datasource
applyFilter(filterValue: string) {
this.datasource.filter = filterValue;
}
ngAfterViewInit() {
// Overwriting filterPredicate here, as it needs to be done after the datasource is loaded.
this.datasource.filterPredicate = (data, filter) => {
var tot = false;
for (let column of this.displayedColumns) {
//incase if there is a date type and is displayed differently using a pipe, then convert it intorequired format before filtering
//check if all the columnson which you are filtering are actually present
if ((column in data) && (new Date(data[column].toString()).toString() == "Invalid Date")) {
//if not date column
tot = (tot || data[column].toString().trim().toLowerCase().indexOf(filter.trim().toLowerCase()) !== -1);
} else {
//change this to the format in which date is displayed
var date = new Date(data[column].toString());
var m = date.toDateString().slice(4, 7) + " " + date.getDate() + " " + date.getFullYear();
tot = (tot || m.toLowerCase().indexOf(filter.trim().toLowerCase()) !== -1);
}
}
return tot;
}
}
}
S'il vous plaît n'hésitez pas à suggérer des modifications, si cela pourrait être amélioré