Angular, filter et filters
Les filtres dans Angular, le petit truc sympa qui simplifie grandement la vie (je commence à comprendre de plus en plus pourquoi les développeurs java aiment Angular: tous des faignasses, moi aussi, donc j’aime Angular).
Pré-requis: avoir lu les articles précédents:
- http://k33g.github.io/2014/05/17/ANGULAR-01.html
- http://k33g.github.io/2014/05/18/ANGULAR-02.html
- http://k33g.github.io/2014/05/19/ANGULAR-03.html
- http://k33g.github.io/2014/05/20/ANGULAR-04.html
- http://k33g.github.io/2014/05/21/ANGULAR-05.html
- http://k33g.github.io/2014/05/24/ANGULAR-06.html
Filter … dans les templates : on filtre ng-repeat
Imaginons que je veuille ajouter au-dessus de ma liste de livre une zone de texte qui me permette de filtrer ma liste en fonction du texte saisi, et ceci de manière dynamique… et sans écrire une ligne de javascript :)
Actuellement notre liste ressemble à ceci:
Filter them all
Nous allons modifier le code de la façon suivante:
On ajoute la zone de texte de recherche et on lui affecte un modèle searchText
(pas besoin de le déclarer dans le code, la directive suffit):
Ensuite on ne change rien …
… sauf au niveau de la directive ng-repeat
à laquelle on ajoute un filtre sur la valeur de searchText
:
Nous avons donc ajouté 3 lignes, et modifié une 4ème. Faites l’exercice d’aller demander à un développeur “pas Angular”, à combien de temps il chiffrerait cette fonctionnalité ;). (mais ça c’est un autre sujet …)
Vous n’avez plus qu’à tester, ça fonctionne très bien mais par contre cela fait de la recherche sur l’ensemble des colonnes. Je voudrais pouvoir faire des recherches par champs.
Filter … Better
Avant tout, allez modifier notre factory Models
, on ajoute un niveau ""
qui permettra de faire des recherches “tous niveaux” (ou autrement dit sans filtre sur le niveau):
Modifions le formulaire de recherche de la manière suivante:
Donc nous avons ajouté des champs de recherche et modifié les directives ng-model
:
ng-model="search.$"
: on cherche dans tous les champsng-model="search.title"
: on cherche dans le titre- etc. …
Modifions ensuite la directive ng-repeat
pour prendre en compte les changements:
Donc, pas beaucoup plus compliqué que toute à l’heure. Vous pouvez tester, et vous aller remarquer que les filtres de recherches sont cumulatifs! Donc une joli fonctionnalité de recherche à pas cher ;).
Vous pouvez aussi utiliser l’API filter
en “pur” javascript si vous devez filtrer des tableaux, mais là je vous laisse jeter un coup d’oeil à la documentation d’Angular https://docs.angularjs.org/api/ng/filter/filter.
Filters : les “filtres de formatage”
Si vous faites des recherches dans Google sur angular + filter
, vous tomberez sur le sujet que nous venons de traiter mais aussi sur la notion de filtre de format d’affichage : on définit la manière dont on veut afficher les données (dates, nombre, monnaie, …).
Afficher en majuscules
Par exemple, toujours dans ma liste, je souhaite afficher les niveaux en majuscules. Il suffit de modifier :
par :
Là aussi je vous engage à aller voir la documentation : https://docs.angularjs.org/guide/filter
Faire son propre filtre d’affichage : stars
Je souhaite afficher un certain nombre d’étoiles en fonction du niveau, plutôt que d’afficher le niveau en toutes lettres. Pour cela, il suffit de quelques lignes de javascript pour créer son propre filtre :
Allons éditer public/js/main.js
pour ajouter le code suivant:
Nous avons donc notre filtre, et pour l’utiliser il suffit de modifier côté html la ligne de toute à l’heure:
en remplaçant le filtre uppercase
par stars
:
Vous n’avez plus qu’à vérifier. Pratique non?
Allez, à demain. Nous parlerons (probablement) de ng-include
.
Bon Dimanche!
Tweet