Je pensais que ce serait une chose très courante, mais je n'ai pas trouvé comment le gérer dans AngularJS. Disons que j'ai une liste d'événements et que je veux les sortir avec AngularJS, alors c'est assez simple:
<ul>
<li ng-repeat="event in events">{{event.title}}</li>
</ul>
Mais comment gérer le cas lorsque la liste est vide? Je veux avoir une boîte de message en place où la liste est avec quelque chose comme "Aucun événement" ou similaire. La seule chose qui se rapprocherait est le ng-switch
avec events.length
(comment puis-je vérifier s'il est vide quand un objet et non un tableau?), Mais est-ce vraiment la seule option que j'ai?
Réponses:
Vous pouvez utiliser ngShow .
Voir l' exemple .
Ou vous pouvez utiliser ngHide
Voir l' exemple .
Pour objet, vous pouvez tester Object.keys .
la source
ng-hide="hasEvents()"
.Et si vous souhaitez l'utiliser avec une liste filtrée, voici une astuce intéressante:
la source
filteredItems
et définit sa valeur sur(items | filter:keyword)
- en d'autres termes, le tableau renvoyé par le filtre"face in filteredFaces = faces|filter:{deleted: true} | orderBy:'text'
mais je suis d'accord avec tout le monde, c'est une astuce fabuleuse.Vous voudrez peut-être consulter la directive angular-ui
ui-if
si vous souhaitez simplement supprimer leul
du DOM lorsque la liste est vide:la source
ng-hide
sans angular-ui, mais cela masquera simplement le nœud, il ne le supprimera pas de l'arborescence DOM. Avec laui-if
directive angular-ui , il supprimera le nœud DOM. Donc, vous devez au moins ajouter laui-if
directive du code angular-ui à votre propre code.ng-if
inclus!ng-if
crée une nouvelle portée, où ilng-hide
n'y en a pas. Cela peut provoquer un comportement inattendu.Avec les nouvelles versions d'angularjs, la bonne réponse à cette question est d'utiliser
ng-if
:Cette solution ne scintillera pas non plus lorsque la liste est sur le point d'être téléchargée car la liste doit être définie et d'une longueur de 0 pour que le message s'affiche.
Voici un plongeur pour le montrer en cours d'utilisation: http://plnkr.co/edit/in7ha1wTlpuVgamiOblS?p=preview
Conseil: vous pouvez également afficher un texte de chargement ou une double flèche:
la source
Ceci est similaire à @Konrad 'ktoso' Malawski mais légèrement plus facile à retenir.
Testé avec Angular 1.4
la source
ng-if='!filteredItems.length'
item in items | filter: ... | filter: ...
<li ng-if="!filteredItems.length">
item in (filteredItems = (items | filter: someFilter))
Voici une approche différente en utilisant CSS au lieu de JavaScript / AngularJS.
CSS:
Balisage:
Si la liste est vide, <li ng-repeat = "item in filtersItems">, etc. sera mis en commentaire et deviendra un commentaire au lieu d'un élément li.
la source
Vous pouvez utiliser ce ng-switch:
la source
Vous pouvez utiliser un
as
mot-clé pour référencer une collection sous unng-repeat
élément:la source
j'utilise habituellement ng-show
où variable vous définissez par exemple
la source
vous pouvez utiliser ng-if car ce n'est pas le rendu dans la page html et vous ne voyez pas votre balise html dans inspect ...
la source