2015-02-09 6 views
40

Come posso specificare un indice in cui una direttiva ng-repeat sta per iniziare anziché zero?ng-repeat specifica un indice iniziale

Ho un set di risultati e ho solo bisogno di specificare quello di partenza, che è diverso da zero.

+1

Se è necessario ordinare o modificare il set di risultati è consigliabile utilizzare un filtro. – bluetoft

risposta

29

Diciamo che avete un elenco di items, si può fare in questo modo:

<div ng-repeat="item in items" ng-if="$index >= myIndex"> 
    {{item.Name}} 
</div> 
+0

Questo rimuove un elemento, voglio ricorrere a loro e iniziare a formarne uno diverso da 0. –

+0

@FedericoVezzoli Se hai bisogno di ricorrere allora ti suggerisco di iterare su un oggetto diverso, fare l'ordinamento nel controller, o forse un filtro come altri hanno suggerito. –

35

È possibile creare un filtro

app.filter('startFrom', function() { 
    return function(input, start) { 
     if(input) { 
      start = +start; //parse to int 
      return input.slice(start); 
     } 
     return []; 
    } 
}); 

e poi basta usarlo sul ng-repeat:

<div ng-repeat="item in items | startFrom : 2">{{item.Name}}</div> 
+0

Dove metti 'app.filter'? in controller.js o app.js? – Whitecat

+0

in questo caso app.js –

+1

"la" variabile app è quella variabile che si ottiene dalla chiamata angular.module() apparentemente – Felype

4

Vorrei creare una funzione che restituisce il sottarray desiderato. Questo può andare nel controller o nella funzione di collegamento di una direttiva.

<span ng-repeat="item in getSubArray(0, 4)">...</span> 

E la funzione

$scope.getSubArray = function (start, end) { 
    return array.slice(start, end); 
} 
+0

Devo dire che il filtro di Emanuel è una soluzione migliore perché è più riutilizzabile – Raulucco

0

Ecco il risultato di ciò che cercavo:

angular.module('starter.filters', []).filter('startFrom', function() { 
return function(input, start) { 
    if(input) { 
     start = +start; //parse to int 
     appended = input.slice(0,start); 
     initialArray = input.slice(start); 
     finalArray= initialArray.concat(appended); 
     return finalArray; 
    } 
    return []; 
} 
}); 

grazie @emanuel

2

questo ha funzionato per me:

<element ng-repeat="round in view.rounds track by $index"> 
    <span>{{$index + 1}}</span> 
</element> 
2

Questo potrebbe fare il trucco ...

<div ng-repeat="(i, item) in items"> 
    <p>{{i+1}}</p> 
</div> 
46

nessuna necessità di codificare qualsiasi cosa, angolare ha fatto questo con il esistente incorporato limitTo filtro. Basta usare un limite negativo. Dalla documentazione per l'argomento limit:

La lunghezza dell'array restituito o della stringa. Se il numero limite è positivo, vengono copiati il ​​numero limite di elementi dall'inizio della sorgente array/stringa. Se il numero è negativo, il numero limite di elementi dalla fine dell'array/stringa di origine viene copiato. Il limite verrà tagliato se supera array.length. Se il limite non è definito, l'input verrà restituito invariato.

Quindi si dovrebbe utilizzare in questo modo nel modello:

<ul> 
    <li data-ng-repeat="i in list | limitTo: (offset - list.length)">{{i}}</li> 
</ul> 

dove offset è l'indice di partenza. Vedere l'esempio plunker.

C'è un begin argomento opzionale in modo da non avete bisogno di utilizzare un negativo limit ma il begin non era disponibile prima v1.4 angolare così ho attaccato ad un negativo limit nel mio esempio.

+2

la soluzione più elegante! Grazie! –

31

Le risposte sembra essere abbastanza vecchio,

dal momento angolare 1.4.0 il filtro limitTo accetta due parametri

limitTo: (limit) : (begin)

si può dire ng-repeat="item in list | limitTo:50:0"

questa sembra essere una soluzione molto efficace piuttosto usando due filtri diversi.

https://code.angularjs.org/1.4.0/docs/api/ng/filter/limitTo

+0

Grazie! Stavo cercando una soluzione migliore ora ne ho trovata una, grazie a te. Chiunque sia interessato ai documenti https://docs.angularjs.org/api/ng/filter/limitTo IMHO dovrebbe essere menzionato anche qui https://docs.angularjs.org/api/ng/directive/ngRepeat – Megajin

+1

Questo dovrebbe essere la risposta selezionata a partire da AngualrJS v1.4 +. –

Problemi correlati