Existe-t-il un moyen de ng-répéter un nombre défini de fois au lieu d'avoir toujours à itérer sur un tableau?
Par exemple, ci-dessous, je souhaite que l'élément de liste apparaisse 5 fois en supposant que $scope.number
soit égal à 5 et incrémente le nombre. Ainsi, chaque élément de liste s'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>
Pour le moment, ng-repeat
accepte uniquement une collection en tant que paramètre, mais vous pouvez le faire:
<ul>
<li ng-repeat="i in getNumber(number)"><span>{{$index+1}}</span></li>
</ul>
Et quelque part dans votre contrôleur:
$scope.number = 5;
$scope.getNumber = function(num) {
return new Array(num);
}
Cela vous permettrait de remplacer $scope.number
par n’importe quel nombre et de maintenir la reliure que vous recherchez.
Voici un violon avec quelques listes utilisant la même fonction getNumber
.
EDIT 1/6/2014 : Les versions les plus récentes de Angular 1.x utilisent la syntaxe suivante:
<li ng-repeat="i in getNumber(number) track by $index">
EDIT le 25/09/2018 : les versions les plus récentes de Angular 1.x vous permettent de le faire sans fonction. Si votre code est simple et que vous n'avez pas besoin d'une fonction getNumber
pour d'autres raisons, vous pouvez maintenant l'omettre et procéder comme suit:
<div ng-repeat="x in [].constructor(number) track by $index">
Merci à @Nikhil Nambiar de sa réponse ci-dessous pour cette mise à jour.
tu peux le faire:
<div ng-repeat="i in [1, 2, 3, 4]">
...
</div>
Voici un exemple de la façon dont vous pourriez faire cela. Notez que j'ai été inspiré par un commentaire dans la documentation ng-repeat: http://jsfiddle.net/digitalzebra/wnWY6/
Notez la directive ng-repeat:
<div ng-app>
<div ng-controller="TestCtrl">
<div ng-repeat="a in range(5) track by $index">{{$index + 1}}</div>
</div>
</div>
Voici le contrôleur:
function TestCtrl($scope) {
$scope.range = function(n) {
return new Array(n);
};
};
Une approche plus simple serait (pour un exemple de 5 fois):
<div ng-repeat="x in [].constructor(5) track by $index">
...
</div>
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és. C'est aussi simple que cela:
<ul>
<li ng-repeat="n in _.range(1,6)"><span>{{n}}</span></li>
</ul>
Cela fera exactement ce que vous recherchez.
Je voulais garder mon code html très minimal, donc défini un petit filtre qui crée le tableau [0,1,2, ...] comme d'autres l'ont fait:
angular.module('awesomeApp')
.filter('range', function(){
return function(n) {
var res = [];
for (var i = 0; i < n; i++) {
res.Push(i);
}
return res;
};
});
Après cela, sur la vue est possible d'utiliser comme ceci:
<ul>
<li ng-repeat="i in 5 | range">
{{i+1}} <!-- the array will range from 0 to 4 -->
</li>
</ul>
C'est vraiment moche, mais cela fonctionne sans contrôleur pour un entier ou une variable:
entier:
<span ng-repeat="_ in ((_ = []) && (_.length=33) && _) track by $index">{{$index}}</span>
variable:
<span ng-repeat="_ in ((_ = []) && (_.length=myVar) && _) track by $index">{{$index}}</span>
Il y a plusieurs façons de le faire. J'étais vraiment dérangé par 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 avec bower install angular-repeat-n
Exemple:
<span ng-repeat-n="4">{{$index}}</span
produit: 1234
Cela fonctionne aussi en utilisant une variable de portée:
<span ng-repeat-n="repeatNum"></span>
Source:
Il ne s'agit que d'une légère variation de la réponse acceptée, mais vous n'avez pas vraiment besoin de créer une nouvelle fonction . Seulement importer 'Array' dans le scope:
<div ng-app="myapp">
<div ng-controller="ctrlParent">
<ul>
<li ng-repeat="i in counter(5) track by $index">
<span>{{$index+1}}</span></li>
</ul>
</div>
</div>
var app = angular.module('myapp',[]);
app.controller('ctrlParent',function($scope){
$scope.myNumber = 5;
$scope.counter = Array;
});
Voir ce violon pour un exemple en direct.
JS (dans votre contrôleur AngularJS)
$scope.range = new Array(MAX_REPEATS); // set MAX_REPEATS to the most repetitions you will ever need in a single ng-repeat that makes use of this strategy
HTML
<div ng-repeat="i in range.slice(0,repeatCount) track by $index"></div>
... où repeatCount
est le nombre de répétitions devant apparaître à cet endroit.
angular donne une fonction très douce appelée slice .. en utilisant cela, vous pouvez obtenir ce que vous cherchez. par ex. 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:
<div class="div" ng-app >
<div ng-controller="Main">
<h2>sliced list(conditional NG-repeat)</h2>
<ul ng-controller="ctrlParent">
<li ng-repeat="ab in abc.slice(2,5)"><span>{{$index+1}} :: {{ab.name}} </span></li>
</ul>
<h2>unsliced list( no conditional NG-repeat)</h2>
<ul ng-controller="ctrlParent">
<li ng-repeat="ab in abc"><span>{{$index+1}} :: {{ab.name}} </span></li>
</ul>
</div>
CSS:
ul
{
list-style: none;
}
.div{
padding:25px;
}
li{
background:#d4d4d4;
color:#052349;
}
ng-JS:
function ctrlParent ($scope) {
$scope.abc = [
{ "name": "What we do", url: "/Home/AboutUs" },
{ "name": "Photo Gallery", url: "/home/gallery" },
{ "name": "What we work", url: "/Home/AboutUs" },
{ "name": "Photo play", url: "/home/gallery" },
{ "name": "Where", url: "/Home/AboutUs" },
{ "name": "playground", url: "/home/gallery" },
{ "name": "What we score", url: "/Home/AboutUs" },
{ "name": "awesome", url: "/home/gallery" },
{ "name": "oscar", url: "/Home/AboutUs" },
{ "name": "american hustle", url: "/home/gallery" }
];
}
function Main($scope){
$scope.items = [{sort: 1, name: 'First'},
{sort: 2, name: 'Second'},
{sort: 3, name: 'Third'},
{sort: 4, name:'Last'}];
}
Vous pouvez utiliser la directive ng-if
avec ng-repeat
Donc, si num est le nombre de fois où vous avez besoin de répéter l'élément:
<li ng-repeat="item in list" ng-if="$index < num">
Voici une réponse pour angular 1.2.x
En gros, il en va de même, avec la légère modification de la ng-repeat
<li ng-repeat="i in getNumber(myNumber) track by $index">
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.
<li ng-repeat="x in [1,1,1]"></li>
En développant un peu la première réponse d'Ivan, vous pouvez utiliser une chaîne comme collection sans instruction piste par déclaration tant que les caractères sont uniques. Par conséquent, si le cas d'utilisation contient moins de 10 chiffres, comme je le ferais simplement pour la question :
<ul>
<li ng-repeat="n in '12345'"><span>{{n}}</span></li>
</ul>
Ce qui est un peu jenky, bien sûr, mais assez simple à regarder et pas particulièrement déroutant.
Vous pouvez utiliser cet exemple.
Contrôleur interne:
$scope.data = {
'myVal': 33,
'maxVal': 55,
'indexCount': function(count) {
var cnt = 10;
if (typeof count === 'number') {
cnt = count;
}
return new Array(cnt);
}
};
Exemple pour l'élément select côté code HTML:
<select ng-model="data.myVal" value="{{ data.myVal }}">
<option ng-repeat="i in data.indexCount(data.maxVal) track by $index" value="{{ $index + 1 }}">{{ $index + 1 }}</option>
</select>
Pour les utilisateurs de CoffeeScript, vous pouvez utiliser une plage de compréhension:
Directive
link: (scope, element, attrs) ->
scope.range = [1..+attrs.range]
ou contrôleur
$scope.range = [1..+$someVariable]
$scope.range = [1..5] # Or just an integer
Modèle
<div ng-repeat="i in range">[ the rest of your code ]</div>
Commencez par créer un filtre angular à l'aide de LoDash:
angular.module('myApp').filter('times', function(){
return function(value){
return _.times(value || 0);
}
});
La fonction fois de LoDash est capable de gérer des représentations nulles, non définies, 0, nombres et chaînes.
Ensuite, utilisez-le dans votre code HTML comme ceci:
<span ng-repeat="i in 5 | times">
<!--DO STUFF-->
</span>
ou
<span ng-repeat="i in myVar | times">
<!--DO STUFF-->
</span>
Si n n'est pas trop élevé, une autre option pourrait être d'utiliser split ('') avec une chaîne de n caractères:
<div ng-controller="MainCtrl">
<div ng-repeat="a in 'abcdefgh'.split('')">{{$index}}</div>
</div>
J'ai rencontré le même problème et voici ce que je suis sorti avec:
(function () {
angular
.module('app')
.directive('repeatTimes', repeatTimes);
function repeatTimes ($window, $compile) {
return { link: link };
function link (scope, element, attrs) {
var times = scope.$eval(attrs.repeatTimes),
template = element.clone().removeAttr('repeat-times');
$window._(times).times(function (i) {
var _scope = angular.extend(scope.$new(), { '$index': i });
var html = $compile(template.clone())(_scope);
html.insertBefore(element);
});
element.remove();
}
}
})();
... et le html:
<div repeat-times="4">{{ $index }}</div>
J'ai utilisé la fonction times
du trait de soulignement, car nous l'utilisions déjà dans le projet, mais vous pouvez facilement le remplacer par du code natif.
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:
<div id="demo">
<ul>
<li ng-repeat="not in []|fixedNumber:number track by $index">{{$index}}</li>
</ul>
</div>
JS:
module.filter('fixedNumber', function() {
return function(emptyarray, number) {
return Array(number);
}
});
module.controller('myCtrl', ['$scope', function($scope) {
$scope.number = 5;
}]);
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.
J'avais besoin d'une solution plus dynamique pour cela - où je pourrais incrémenter la répétition.
HTML
<div ng-repeat="n in newUserCount">
<input type="text" value="" name="newuser{{n}}"/>
</div>
Contrôle du duplicateur
<span class="helper" ng-click="duplicateUser()">
Create another user with the same permissions
</span>
JS
$scope.newUserCount = Array('1');
var primaryValue = 1;
$scope.duplicateUser = function()
{
primaryValue++;
$scope.newUserCount.Push(primaryValue)
}
itérant sur une chaîne, il restituera un élément pour chaque caractère:
<li ng-repeat = "k in 'aaaa' track by $index">
{{$index}} //THIS DOESN'T ANSWER OP'S QUESTION. Read below.
</li>
nous pouvons utiliser cette solution moche mais sans code en utilisant le filtre natif number|n decimal places
.
<li ng-repeat="k in (0|number:mynumber -2 ) track by $index">
{{$index}}
</li>
ainsi, nous aurons mynumber
éléments sans code supplémentaire. Dites '0.000'
.
Nous utilisons mynumber - 2
pour compenser 0.
Cela ne fonctionnera pas pour les nombres inférieurs à 3, mais pourrait être utile dans certains cas.
$scope.number = 5;
<div ng-repeat="n in [] | range:$scope.number">
<span>{{$index}}</span>
</div>
Je crée une directive réutilisable où le nombre maximum proviendra d'une autre répétition ng. Donc, ceci est une édition sur la meilleure réponse votée.
Il suffit de changer le code du contrôleur en ceci -
$scope.getNumber = function(num) {
var temp = [];
for(var j = 0; j < num; j++){
temp.Push(j)
}
return temp;
}
Cela retournera un nouveau tableau avec le nombre spécifié d'itérations