Je veux utiliser ng-repeat dans Angular, alors que je veux seulement sortir quelques éléments du tableau. Un exemple:
ng-repeat="item in items | filter:($index%3 == 0)"
Cependant, cela ne fonctionne pas. S'il-te-plaît dis moi comment faire ça; ne sortir que l'index exact des éléments.
Dans votre code, le filtre s'applique sur le tableau 'items', et non sur chaque élément du tableau, c'est pourquoi il ne fonctionne pas comme prévu.
Au lieu de cela, vous pouvez utiliser ng-show (ou ng-if):
<ul>
<li ng-repeat="item in items" ng-show="$index % 3 == 0">{{item}}</li>
</ul>
Voir: http://jsfiddle.net/H7d26
EDIT: Utilisez la directive ng-if si vous ne souhaitez pas ajouter d'éléments invisibles:
<ul>
<li ng-repeat="item in items" ng-if="$index % 3 == 0">{{item}}</li>
</ul>
Créez un filter personnalisé, par exemple:
filter('modulo', function(){
return function (arr, div, val) {
return arr.filter(function(item, index){
return index % div === (val || 0);
})
};
});
Puis changez le ng-repeat
en:
<ul ng-repeat="item in items | modulo:3">
Ou filtrer par (index % 3 === 1)
comme:
<ul ng-repeat="item in items | modulo:3:1">
Ce que vous devez faire, c'est trouver l'index de "item" dans $ scope.items. Voir ci-dessous
ng-repeat"item in items | filter:(items.indexOf(item)%3 == 0)
Donc, un exemple du monde réel (pour les autres qui rencontrent cette solution) serait.
<div ng-repeat="item in filtered = (items | filter:customfilter | orderBy:customsort)">
<div> This is number {{items.indexOf(item)}} in the items list on the scope.</div>
</div>
L’exemple ci-dessus obtiendra la position correcte quel que soit le tri ou le filtrage
Toutes les réponses précédentes fonctionneront, mais si vous souhaitez utiliser un filtre, vous pouvez également le définir vous-même, comme dans ce violon: http://jsfiddle.net/DotDotDot/58y7u/
.filter('myFilter', function(){
return function(data, parameter){
var filtered=[];
for(var i=0;i<data.length;i++){
if(i%parameter==0)
filtered.Push(data[i]);
}
return filtered;
}
});
puis appelez ça comme ça:
ng-repeat='item in items | myFilter:3'
(J'ai ajouté une complexité supplémentaire avec un paramètre, si vous voulez le changer rapidement en nombres pairs par exemple)
S'amuser
++
Je suggère de filtrer avec une fonction:
ng-repeat"item in filterItems(items)"
Et sur le contrôleur:
$scope.filterItems= function(items) {
var result = {};
angular.forEach(items, function(item) {
// if item is something.. add to result
});
return result;
}
Une autre solution pour résoudre ce problème crée une nouvelle "liste" (je ne connais pas le terme approprié dans ce contexte) dans le ng-repeat
. Cette nouvelle liste peut alors être référencée dans le cadre
<ul class="example-animate-container">
<li class="animate-repeat" ng-repeat="friend in filteredFriends = ((friends | filter:q:strict) | orderBy:'age')" ng-if="$index % 2 == 0">
[{{$index + 1}}] {{filteredFriends[$index].name}} who is {{filteredFriends[$index].age}} years old.
<span ng-if="$index+1 < filteredFriends.length">[{{$index + 2}}] {{filteredFriends[$index+1].name}} who is {{filteredFriends[$index+1].age}} years old.</span>
</li>
</ul>
Le ng-if
sur la span
enveloppant la seconde moitié empêche l'affichage du texte de base lorsque l'élément précédent est le dernier élément de la liste.