J'ai besoin de créer une liste d'éléments séparés par des virgules:
<li ng-repeat="friend in friends">
<b ng-repeat="email in friend.email">{{email}}{{$last ? '' : ', '}}</b>...
</li>
Selon la documentation AngularJS, aucune instruction de flux de contrôle n'est autorisée dans les expressions. C'est pourquoi mon {{$last ? '' : ', '}}
ne fonctionne pas.
Existe-t-il un autre moyen de créer des listes séparées par des virgules?
EDIT 1
est-il quelque chose de plus simple que:
<span ng-show="!$last">, </span>
angularjs
angularjs-ng-repeat
Franck Freiburger
la source
la source
Réponses:
Vous pouvez le faire de cette façon:
<b ng-repeat="email in friend.email">{{email}}{{$last ? '' : ', '}}</b>
..Mais j'aime la réponse de Philipp :-)
la source
($last && '' || ', ')
toujours céder', '
?{{{true: '', false: ', '}[$last]}}
. Cette technique est plus flexible que l'utilisation.join
car elle permet aux éléments de la liste d'être chacun membres d'un tableau, comme:<b ng-repeat="friend in friends">{{friend.email}}{{{true: '', false: ', '}[$last]}}</b>
Utilisez simplement la fonction intégrée de Javascript
join(separator)
pour les tableaux:la source
join()
et désactiver l'échappement HTML, mais il y a une place spéciale en enfer pour cela;)Aussi:
Et dans le modèle:
la source
{{ itemsArray.join(', ') }}
?la source
Vous pouvez également utiliser CSS pour le corriger
Mais la réponse d'Andy Joslin est la meilleure
Edit: j'ai changé d'avis, je devais le faire récemment et j'ai fini par utiliser un filtre de jointure.
la source
Je pense qu'il vaut mieux l'utiliser
ng-if
.ng-show
crée un élément dans ledom
et le définitdisplay:none
. Plusdom
vous avez d'éléments, plus votre application est gourmande en ressources, et sur les appareils avec moins de ressources, moins il y a d'dom
éléments, mieux c'est.TBH
<span ng-if="!$last">, </span>
semble être un excellent moyen de le faire. C'est simple.la source
Comme cette question est assez ancienne et qu'AngularJS a eu le temps d'évoluer depuis, cela peut maintenant être facilement réalisé en utilisant:
<li ng-repeat="record in records" ng-bind="record + ($last ? '' : ', ')"></li>
.Notez que j'utilise à la
ngBind
place de l'interpolation{{ }}
car c'est beaucoup plus performant:ngBind
ne fonctionnera que lorsque la valeur passée change réellement. Les parenthèses{{ }}
, par contre, seront vérifiées et actualisées dans chaque $ digest, même si ce n'est pas nécessaire. Source: ici , ici et ici .Sur une note finale, toutes les solutions ici fonctionnent et sont valables à ce jour. Je suis vraiment tombé sur ceux qui impliquent CSS car il s'agit plus d'un problème de présentation.
la source
J'aime l'approche de simbu, mais je ne suis pas à l'aise d'utiliser le premier ou le dernier enfant. Au lieu de cela, je ne modifie que le contenu d'une classe répétitive de liste-virgule.
la source
Si vous utilisez ng-show pour limiter les valeurs, cela
{{$last ? '' : ', '}}
ne fonctionnera pas car il prendra toujours en compte toutes les valeurs.Résultat en ajoutant une virgule après la "dernière" valeur , car avec ng-show, il prend toujours en compte les 4 valeurs
Une solution consiste à ajouter un filtre directement dans ng-repeat
Résultats
la source