Apparemment, Angular 2 utilisera des tuyaux au lieu de filtres comme dans Angular1 en conjonction avec ng-for pour filtrer les résultats, bien que l'implémentation semble toujours vague, sans documentation claire.
À savoir ce que j'essaie de réaliser pourrait être considéré du point de vue suivant
<div *ng-for="#item of itemsList" *ng-if="conditon(item)"></div>
Comment mettre en œuvre ainsi en utilisant des tuyaux?
angular
typescript
Khaled
la source
la source
<div *ngFor="let item of itemsList" *ngIf="conditon(item)" ...
*ngFor
et*ngIf
sur le même élément ne sont pas pris en charge. Vous devez modifier le formulaire explicite pour l'un d'eux"Réponses:
Fondamentalement, vous écrivez un tube que vous pouvez ensuite utiliser dans la
*ngFor
directive.Dans votre composant:
Dans votre modèle, vous pouvez passer une chaîne, un nombre ou un objet à votre pipe pour l'utiliser pour filtrer:
Dans votre pipe:
N'oubliez pas d'enregistrer votre pipe
app.module.ts
; vous n'avez plus besoin d'enregistrer les tuyaux dans votre@Component
Voici un plongeur qui l'utilisation d'un tuyau de filtre personnalisé et du tuyau de coupe intégré pour limiter les résultats.
Veuillez noter (comme plusieurs commentateurs l'ont souligné) qu'il y a une raison pour laquelle il n'y a pas de tuyaux de filtre intégrés dans Angular.
la source
*ngFor
paramètres entre parenthèses, juste pour éviter toute confusion et le rendre "à l'épreuve du changement":<li *ngFor="let item of (items | myfilter:filterargs)">
Beaucoup d'entre vous ont d'excellentes approches, mais l'objectif ici est d'être générique et de définir un tube de tableau qui est extrêmement réutilisable dans tous les cas en relation avec * ngFor.
callback.pipe.ts (n'oubliez pas d'ajouter ceci au tableau de déclaration de votre module)
Ensuite, dans votre composant, vous devez implémenter une méthode avec la signature suivante (item: any) => booléen , dans mon cas par exemple, je l'ai appelé filterUser, qui filtre l'âge des utilisateurs supérieur à 18 ans.
Votre composant
Et enfin et surtout, votre code html ressemblera à ceci:
Votre HTML
Comme vous pouvez le voir, ce canal est assez générique sur tous les éléments de type tableau qui doivent être filtrés via un rappel. Dans mon cas, je l'ai trouvé très utile pour * ngFor comme des scénarios.
J'espère que cela t'aides!!!
codematrix
la source
this
être indéfini, vous pouvez écrire votre méthode sur votre composant commefilterUser = (user: IUser) =>
plutôt quefilteruser(user: IUser)
this
sur votre méthode de composant est que la méthode était utilisée comme rappel et qu'un nouveauthis
contexte a été appliqué. Vous avez rencontré un problème courant en javascript orienté objet, mais il existe une solution ancienne et simple: vous liez des méthodes à utiliser comme rappels à la classe d'origine. Dans votre constructeur, ajoutez le code suivant:this.myCallbackFunc = this.myCallbackFunc.bind(this);
C'est tout. Vous ne perdrezthis
plus jamais .Manière simplifiée (utilisé uniquement sur les petits tableaux en raison de problèmes de performances. Dans les grands tableaux, vous devez effectuer le filtre manuellement via le code):
Voir: https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
Usage:
Si vous utilisez une variable comme deuxième argument, n'utilisez pas de guillemets.
la source
C'est ce que j'ai implémenté sans utiliser de pipe.
component.html
component.ts
la source
itemList
un Observable et utiliser le filtre async:let item of itemsList | async
. Lorsqu'un changement se produit, faites en sorte que l'observable émette la nouvelle liste. De cette façon, le code de filtrage n'est exécuté qu'en cas de besoin.Je ne sais pas quand il est arrivé, mais ils ont déjà fait un tuyau de tranche qui le fera. C'est aussi bien documenté.
https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html
la source
;
. par exemple:*ngFor="let feature of content?.keyFeatures | slice:1:5; trackBy feature?.id"
Vous pouvez également utiliser les éléments suivants:
Cela ne montrera le div que si vos articles correspondent à la condition
Voir la documentation angulaire pour plus d'informations Si vous avez également besoin de l'index, utilisez ce qui suit:
la source
les tuyaux dans Angular2 sont similaires aux tuyaux sur la ligne de commande. La sortie de chaque valeur précédente est introduite dans le filtre après le tuyau, ce qui facilite l'enchaînement des filtres ainsi:
la source
item
de*ng-for="#item of itemsList"
devrait être utilisée pour filtrer les résultats en tant que tels*ng-if="conditon(item)"
. Ce qui ne fonctionne pas dans cet exemple ..item
si la condition est remplie et aucune valeur si elle ne l'est pas.*ngFor
et*ngIf
sur le même élément ne sont pas pris en charge. Vous devez changer le formulaire explicite pour l'un d'eux<template ngFor ...>
Pour cette exigence, j'implémente et publie un composant générique . Voir
https://www.npmjs.com/package/w-ng5
Pour utiliser ces composants, avant, installez ce package avec npm:
Après, importez le module dans app.module
À l'étape suivante, ajoutez la section declare de app.module:
Exemple d'utilisation
Filtrage d'une chaîne simple
Filtrage d'une chaîne complexe - champ 'Valeur' au niveau 2
Filtrage d'une chaîne complexe - champ central - «Valeur» au niveau 1
Filtrage d'un tableau complexe simple - champ 'Nome' niveau 0
Filtrage dans les champs de l'arborescence - champ 'Valor' au niveau 2 ou 'Valor' au niveau 1 ou 'Nome' au niveau 0
Filtrage d'un champ inexistant - «Valor» dans un niveau 3 inexistant
Ce composant fonctionne avec un niveau d'attribut infini ...
la source
*ngFor="let inovice of invoices | filter:searchInvoice"
et il recherche dans ma liste, mais affiche une liste vierge, savez-vous pourquoi?Une solution simple qui fonctionne avec Angular 6 pour filtrer un ngFor, c'est la suivante:
Les portées sont utiles car elles ne représentent rien en soi.
la source
Je sais que c'est une vieille question, cependant, j'ai pensé qu'il pourrait être utile de proposer une autre solution.
équivalent de AngularJS de cette
dans Angular 2+, vous ne pouvez pas utiliser * ngFor et * ngIf sur un même élément, il sera donc le suivant:
et si vous ne pouvez pas l'utiliser comme conteneur interne, utilisez plutôt ng-container. ng-container est utile lorsque vous souhaitez ajouter conditionnellement un groupe d'éléments (c'est-à-dire en utilisant * ngIf = "foo") dans votre application mais que vous ne voulez pas les encapsuler avec un autre élément.
la source
J'ai créé un plongeur basé sur les réponses ici et ailleurs.
De plus , je devais ajouter un
@Input
,@ViewChild
etElementRef
de<input>
créer etsubscribe()
à une observable de celui - ci.Filtre de recherche Angular2: PLUNKR (MISE À JOUR: plunker ne fonctionne plus)
la source
La pipe serait la meilleure approche. mais en dessous on fonctionnerait aussi.
la source
Voici mon code:
Échantillon:
la source
Une autre approche que j'aime utiliser pour les filtres spécifiques à une application est d'utiliser une propriété en lecture seule personnalisée sur votre composant qui vous permet d'encapsuler la logique de filtrage plus proprement que d'utiliser un canal personnalisé (IMHO).
Par exemple, si je veux me lier à
albumList
et filtrer sursearchText
:Pour lier dans le HTML, vous pouvez ensuite vous lier à la propriété en lecture seule:
Je trouve que pour les filtres spécialisés qui sont spécifiques à l'application, cela fonctionne mieux qu'un tuyau car il conserve la logique liée au filtre avec le composant.
Les tuyaux fonctionnent mieux pour les filtres réutilisables à l'échelle mondiale.
la source
J'ai créé le tube suivant pour obtenir les éléments souhaités d'une liste.
La conversion en minuscules est juste pour correspondre dans le cas insensible. Vous pouvez l'utiliser dans votre vue comme ceci: -
la source
Idéalement, vous devriez créer un tuyau angualr 2 pour cela. Mais vous pouvez faire cette astuce.
la source
Sur la base de la solution de tuyau de rappel très élégante proposée ci-dessus, il est possible de le généraliser un peu plus en permettant le passage de paramètres de filtre supplémentaires. On a alors:
callback.pipe.ts
composant
html
la source
Voici un exemple que j'ai créé il y a quelque temps et sur lequel j'ai blogué, qui comprend un plunk fonctionnel. Il fournit un tuyau de filtrage qui peut filtrer n'importe quelle liste d'objets. Vous spécifiez simplement la propriété et la valeur {key: value} dans votre spécification ngFor.
Ce n'est pas très différent de la réponse de @ NateMay, sauf que je l'explique de manière relativement détaillée.
Dans mon cas, j'ai filtré une liste non ordonnée sur du texte (filterText) que l'utilisateur a entré par rapport à la propriété "label" des objets de mon tableau avec ce type de balisage:
https://long2know.com/2016/11/angular2-filter-pipes/
la source
La première étape que vous créez à l'aide de Filter
@Pipe
dans votre fichier component.ts:your.component.ts
Et la structure de données de l'objet Personne:
person.ts
Dans votre vue en fichier html:
your.component.html
la source
Ceci est votre tableau
Voici votre boucle ngFor Filtrer par:
Là, j'utilise filterProduct instant des produits, car je veux conserver mes données d'origine. Ici, le modèle _filterText est utilisé comme zone de saisie. Chaque fois qu'il y a une fonction de définition de changement, elle sera appelée. Dans setFilterText, performProduct est appelé, il ne retournera le résultat que ceux qui correspondent à l'entrée. J'utilise des minuscules pour insensible à la casse.
la source
Après quelques recherches sur Google, je suis tombé sur
ng2-search-filter
. Dans prendra votre objet et appliquera le terme de recherche à toutes les propriétés d'objet à la recherche d'une correspondance.la source
Je trouvais quelque chose pour faire un filtre en passant un objet, alors je peux l'utiliser comme multi-filtre:
j'ai fait cette solution de beauté:
filter.pipe.ts
component.ts
component.html
la source