Existe-t-il un moyen d'effectuer ng-repeat
un nombre défini de fois au lieu de toujours avoir à parcourir un tableau?
Par exemple, ci-dessous, je veux que l'élément de liste apparaisse 5 fois en supposant $scope.number
égal à 5 en plus incrémentant le nombre de sorte que chaque élément de liste incrémente comme 1, 2, 3, 4, 5
Résultat désiré:
<ul>
<li><span>1</span></li>
<li><span>2</span></li>
<li><span>3</span></li>
<li><span>4</span></li>
<li><span>5</span></li>
</ul>
javascript
html
angularjs
angularjs-ng-repeat
Malcr001
la source
la source
Réponses:
Mise à jour (25/09/2018)
Les nouvelles versions d'AngularJS (> = 1.3.0) vous permettent de le faire avec seulement une variable (aucune fonction nécessaire):
Cela n'était pas possible au moment où la question a été posée pour la première fois. Nous remercions @Nikhil Nambiar de sa réponse ci-dessous pour cette mise à jour
Original (29/05/2013)
Pour le moment,
ng-repeat
n'accepte qu'une collection comme paramètre, mais vous pouvez le faire:Et quelque part dans votre contrôleur:
Cela vous permettrait de modifier
$scope.number
n'importe quel nombre à votre guise et de conserver la liaison que vous recherchez.EDIT (1/6/2014) - Les nouvelles versions d'AngularJS (> = 1.1.5) nécessitent
track by $index
:Voici un violon avec quelques listes utilisant la même
getNumber
fonction.la source
tu peux le faire:
la source
Voici un exemple de la façon dont vous pouvez le faire. Notez que j'ai été inspiré par un commentaire dans les documents ng-repeat: http://jsfiddle.net/digitalzebra/wnWY6/
Notez la directive ng-repeat:
Voici le contrôleur:
la source
_.range
Underscore ou lodash pour créer le tableau: $ scope.range = _.range (0, n);Je pense que ce jsFiddle de ce fil pourrait être ce que vous cherchez.
la source
$scope.number
égal à 5". L'intention était d'utiliser une variable entière pour définir le nombre d'éléments, pas de le coder en dur et de ne pas utiliser un tableau prédéfini.$scope.limit = 2
) et l'utiliser comme...|limitTo:limit
- voir violon mis à jourUne approche plus simple serait (pour un exemple de 5 fois):
la source
Array(5)
(ou bien[...Array(5).keys()]
obtenir un tableau [0,1,2,3,4])J'ai rencontré le même problème. Je suis tombé sur ce fil, mais je n'ai pas aimé les méthodes qu'ils avaient ici. Ma solution utilisait underscore.js, que nous avions déjà installé. C'est aussi simple que ça:
Cela fera exactement ce que vous recherchez.
la source
$scope._ = _
.$rootScope
pour qu'il puisse être utilisé partout. Mettez ceci dans votreapp.run
fonction juste aprèsapp.config
:app.run(function ($rootScope) { $rootScope._ = _; });
Je voulais garder mon html très minimal, j'ai donc défini un petit filtre qui crée le tableau [0,1,2, ...] comme d'autres l'ont fait:
Après cela, sur la vue est possible d'utiliser comme ceci:
la source
C'est vraiment Moche, mais cela fonctionne sans contrôleur pour un entier ou une variable:
entier:
variable:
la source
_ in (_ = []).length = 33; _ track by $index
légèrement plus petitIl y a plusieurs façons de procéder. J'étais vraiment gêné d'avoir la logique dans mon contrôleur, j'ai donc créé une directive simple pour résoudre le problème de la répétition d'un élément n fois.
Installation:
La directive peut être installée en utilisant
bower install angular-repeat-n
Exemple:
produit:
1234
Il fonctionne également à l'aide d'une variable de portée:
La source:
Github
la source
Ce n'est qu'une légère variation de la réponse acceptée, mais vous n'avez pas vraiment besoin de créer une nouvelle fonction. Uniquement pour importer 'Array' dans la portée:
Voir ce violon pour un exemple en direct.
la source
Réponse la plus simple: 2 lignes de code
JS (dans votre contrôleur AngularJS)
HTML
... où
repeatCount
est le nombre de répétitions qui devraient apparaître à cet endroit.la source
repeatCount
par un nombre réel dans le code HTML, et tant que ce nombre est inférieur ou égal àMAX_REPEATS
, cela vous permettra de définir le nombre de répétitions dans le HTML.ngRepeat
directive. L'utilisation deArray.prototype.slice
JS idiomatique et doit toujours être choisie sur une bibliothèque comme underscore.js (selon la compatibilité du navigateur).angulaire donne une fonction très douce appelée tranche .. en utilisant cela, vous pouvez réaliser ce que vous recherchez. par exemple ng-repeat = "ab dans abc.slice (startIndex, endIndex)"
cette démo: http://jsfiddle.net/sahilosheal/LurcV/39/ vous aidera et vous expliquera comment utiliser cette fonction "rendre la vie facile". :)
html:
CSS:
ng-JS:
la source
Voici une réponse pour 1.2.x angulaire
Fondamentalement, c'est la même chose, avec la légère modification de la
ng-repeat
voici le violon: http://jsfiddle.net/cHQLH/153/
En effet, angular 1.2 n'autorise pas les valeurs en double dans la directive. Cela signifie que si vous essayez de faire ce qui suit, vous obtiendrez une erreur.
la source
Vous pouvez utiliser la
ng-if
directive avecng-repeat
Donc, si num est le nombre de fois où l'élément doit être répété:
la source
ng-repeat
de cette manière produira toujours ses balises commentées (<!-- ngIf: $index < num -->
etc.). Il n'y aura tout simplement aucunli
élément à rendre par le DOM. Vérifiez une "source d'affichage" dans le volet des résultats ici pour voir ce que je veux dire.Vous pouvez utiliser cet exemple.
Contrôleur intérieur:
Exemple d'élément select du côté du code HTML:
la source
Pour les utilisateurs utilisant CoffeeScript, vous pouvez utiliser une compréhension de plage:
Directif
ou contrôleur
Modèle
la source
En développant un peu la première réponse d'Ivan, vous pouvez utiliser une chaîne comme collection sans instruction track by tant que les caractères sont uniques, donc si le cas d'utilisation est inférieur à 10 chiffres, comme c'est la question que je ferais simplement :
Ce qui est un peu jenky, bien sûr, mais assez simple à regarder et pas particulièrement déroutant.
la source
Créez d'abord un filtre angulaire à l'aide de LoDash:
La fonction de temps LoDash est capable de gérer des représentations nulles, non définies, 0, des nombres et des chaînes de nombres.
Ensuite, utilisez-le dans votre HTML comme ceci:
ou
la source
J'avais besoin d'une solution plus dynamique à cela - où je pourrais incrémenter la répétition.
HTML
Contrôle du duplicateur
JS
la source
Angular fournit des filtres pour modifier une collection. Dans ce cas, la collection serait nulle, c'est-à-dire [], et le filtre prend également des arguments, comme suit:
JS:
Cette méthode est très similaire à celles proposées ci-dessus et n'est pas nécessairement supérieure mais montre la puissance des filtres dans AngularJS.
la source
Si n n'est pas trop élevé, une autre option pourrait être d'utiliser split ('') avec une chaîne de n caractères:
la source
J'ai rencontré le même problème et voici ce avec quoi je suis sorti:
... et le html:
EXEMPLE EN DIRECT
J'ai utilisé la
times
fonction de soulignement car nous l'utilisions déjà sur le projet, mais vous pouvez facilement la remplacer par du code natif.la source
Je crée une directive réutilisable où le nombre maximum proviendra d'une autre répétition ng. Il s'agit donc d'une modification de la meilleure réponse votée.
Changez simplement le code du contrôleur en ceci -
Cela renverra un nouveau tableau avec un nombre spécifié d'itérations
la source
puisque l'itération sur une chaîne, il rendra un élément pour chaque caractère:
nous pouvons utiliser cette solution de contournement laide mais sans code en utilisant le
number|n decimal places
filtre natif.de cette façon, nous aurons des
mynumber
éléments sans code supplémentaire. Dis'0.000'
.Nous utilisons
mynumber - 2
pour compenser0.
Cela ne fonctionnera pas pour les nombres inférieurs à 3, mais pourrait être utile dans certains cas.
la source
track by $index
?ng-repeat="i in [1,2,3,4]"
$scope.number
aaaa
était un exemple pour expliquer ma solution de contournement - pas très élégante -. En utilisant «aaaa» ou «abcd» codé en dur, vous obtenez une liste de longueur fixe, mais en ajoutant desmynumber-2
décimales à 0, vous obtenez une «chaîne» avec desmynumber
caractères. Ditesmynumber=5
, vous obtenez'0.000'
, puis nous répétons cela en utilisant $ indexla source
manière simple:
dans le composant / contrôleur puis:
Ce code provient de mon projet dactylographié mais pourrait être réorganisé en javascript pur
la source