2017-05-18 5 views
0

je suis en train de faire un tuyau souple pour filtrer mon tableau d'objets pour l'afficher avec * ngFortuyau souple pour filtrer les objets

<div class="wrapper" *ngFor="let item of items | myFilter:property:true"> 

par exemple, je veux montrer div seulement pour objet avec une véritable propriété:

[ 
{'name':'first', 'property': 'true'}, 
{'name':'last', 'property': 'false'} 
] 

Il semble ne pas fonctionner lorsque je tente de définir la propriété dynamique comme celui-ci

import { Pipe, PipeTransform } from '@angular/core'; 

@Pipe({ 
name: 'myFilter' 
}) 
export class FilterPipe implements PipeTransform { 
    transform(items: any[], key: any, value: any): any { 
     return items.filter(item => item[key] === value ? item : null); 
    } 
} 

J'ai essayé aussi ce

item['"' + key + '"'] 

et cela (avec des chaînes de modèle de ES6)

item[`"$key"`] 

mais cette conduite fonctionne bien si j'appelle propriété droit comme celui-ci

item.property 

Et je vraiment besoin de faire plus flexible, parce que j'ai beaucoup de situations dans mon application où j'ai besoin de filtrer les éléments par différentes valeurs de propriétés

+0

Vérifiez cela: http://stackoverflow.com/questions/41672578/filter-on-multiple-columns-using-one-pipe-angular-2/41841674#41841674 –

Répondre

0

Votre tuyau est certainement correct, vous manque juste la '' sur votre HTML Essayez de l'appeler comme ceci: <div class="wrapper" *ngFor="let item of items | myFilter:'property':true"> et cela fonctionnera parfaitement. C'est parce que le canal attend une chaîne, mais vous donnez une référence d'objet. propriété! = 'propriété'

+0

thx a lot. maintenant cela fonctionne –

+0

Heureux que cela a aidé :) –

+0

Rappelez-vous que c'est la même chose pour la valeur de la clé, si vous voulez comparer les chaînes et non booléen, vous devez utiliser le '' :) –

0

Array.filter attend votre fonction de filtre pour retourner un boolean, ce qui signifie que vous devez changer votre filtre pour cela:

transform(items: any[], key: any, value: any): any { 
    return items.filter(item => item[key] === value); 
} 

Source: MDN

+0

thx pour la correction , mais ça ne marche toujours pas. Comme je l'ai dit, il fonctionnait avec la propriété droite appelant –

+0

vous devriez probablement vérifier si item [propriété] existe en utilisant un fichier console.log juste avant le retour (vérifiez avec console.log (items [0] [propriété])) – Supamiu