J'ai besoin de créer un formulaire de recherche dans Angular 6 avec pipe et je dois passer plusieurs arguments à pipe.
nameSearch
, emailSearch
, roleSeach
, accountSearch
<tr *ngFor="let user of data | searchuser: nameSearch" ></tr>
et voici ma pipe:
@Pipe({
name: 'searchuser'
})
export class SearchuserPipe implements PipeTransform {
transform(users: IUser[], nameSearch: string): IUser[] {
if(!users) return [];
if(!nameSearch) return users;
nameSearch=nameSearch.toLocaleLowerCase();
return users.filter(item=>
{
return item.desplayName.toLocaleLowerCase().includes(nameSearch)
});
}
s'il vous plaît guidez-moi comment créer une recherche de pipe avec plusieurs arguments.
Modifier:
transform(users: IUser[], nameSearch: string ,eamilSearch:string,roleSearch:string): IUser[] {
if(!users) return [];
if(!nameSearch) return users;
if(!eamilSearch) return users;
if(!roleSearch) return users;
nameSearch=nameSearch.toLocaleLowerCase();
return users.filter(item=>
{
item.desplayName.toLocaleLowerCase().includes(nameSearch),
item.email.toLocaleLowerCase().includes(eamilSearch),
item.description.toLocaleLowerCase().includes(roleSearch)
});
}
Vous pouvez ajouter plus de paramètres à la méthode transform
que vous devrez implémenter dans le tube.
Rendez ces paramètres facultatifs afin de pouvoir les utiliser selon votre convenance.
Quelque chose comme ça:
import { Pipe, PipeTransform } from '@angular/core';
export interface IUser {
displayName: string;
name: string;
email: string;
role: string;
account: string;
description: string;
}
@Pipe({
name: 'searchUser'
})
export class SearchUserPipe implements PipeTransform {
transform(
users: IUser[],
nameSearch?: string,
emailSearch?: string,
roleSearch?: string,
accountSearch?: string
): IUser[] {
if (!users) return [];
if (!nameSearch) return users;
nameSearch = nameSearch.toLocaleLowerCase();
users = [...users.filter(user => user.displayName.toLocaleLowerCase() === nameSearch)];
if (!emailSearch) return users;
emailSearch = emailSearch.toLocaleLowerCase();
users = [...users.filter(user => user.email.toLocaleLowerCase() === emailSearch)];
if (!roleSearch) return users;
roleSearch = roleSearch.toLocaleLowerCase();
users = [...users.filter(user => user.role.toLocaleLowerCase() === roleSearch)];
return users;
}
}
Maintenant, dans votre modèle, vous pouvez simplement utiliser ce pipe
et passer des arguments séparés par une couleur (:
), quelque chose comme ça:
<input type="text" placeholder="name" [(ngModel)]="nameSearch">
<input type="text" placeholder="email" [(ngModel)]="emailSearch">
<input type="text" placeholder="role" [(ngModel)]="roleSearch">
<input type="text" placeholder="account" [(ngModel)]="accountSearch">
<table>
<tbody>
<tr *ngFor="let user of data | searchUser: nameSearch: emailSearch: roleSearch: accountSearch">
<td>
{{ user | json }}
</td>
</tr>
</tbody>
</table>
Voici également le code du composant:
import { Component } from '@angular/core';
@Component({...})
export class AppComponent {
nameSearch = '';
emailSearch = '';
roleSearch = '';
accountSearch = '';
data = [...];
}
Voici un exemple de travail StackBlitz pour votre référence.
Cela devrait être la même manière que vous passez le paramètre unique avec une séparation par virgule comme suit,
export class SearchuserPipe implements PipeTransform {
transform(users: IUser[], nameSearch:string, emailSearch:string, roleSearch:
string):IUser[] {
}
et dans le modèle,
<tr *ngFor="let user of data | searchuser: nameSearch : emailSearch : roleSearch" ></tr>