Angularjs sbaglia $ index dopo orderBy

Sono nuovo di Angular.js e ho alcuni problemi nell’ordinare il mio array e lavorare su quei dati ordinati.

Ho una lista con gli articoli e voglio così ordinarla per “Store.storeName”, che sta funzionando finora. Ma dopo aver ordinato i dati, la mia funzione di cancellazione non funziona più. Penso che questo sia perché l’indice $ è sbagliato dopo l’ordinamento, e quindi i dati errati vengono cancellati.

Come posso risolverlo? Ordinare i dati nell’ambito e non nella vista? Come farlo?

Ecco alcuni codici rilevanti:

Nella vista:

  {{item.Name}} {{item.Quantity}} Stk. {{item.Price || 0 | number:2}} € {{item.Quantity*item.Price|| 0 | number:2}} € {{item.Store.storeName}} {{$index}}  

E nel mio controller ho questa funzione di cancellazione, che dovrebbe eliminare i dati specifici:

 $scope.removeItem = function(index){ $scope.items.splice(index,1); } 

Funziona bene prima di ordinare nella vista. Se manca qualcosa di importante, per favore lasciami ora.

Grazie!

Invece o inoltro sull’indice $index – che – come hai notato – punterà all’indice in un array ordinato / filtrato, puoi passare l’elemento stesso alla tua funzione removeItem :

 {{$index}} 

e modificare la funzione removeItem per trovare un indice usando il metodo indexOf di una matrice come segue:

 $scope.removeItem = function(item){ $scope.items.splice($scope.items.indexOf(item),1); } 

Ho avuto lo stesso problema e altre risposte in questo argomento non sono adatte alla mia situazione.

Ho risolto il mio problema con il filtro personalizzato:

 angular.module('utils', []).filter('index', function () { return function (array, index) { if (!index) index = 'index'; for (var i = 0; i < array.length; ++i) { array[i][index] = i; } return array; }; }); 

che può essere usato in questo modo:

  

e poi in HTML puoi usare item.index invece di $index .

Questo metodo è adatto per le collezioni di oggetti.

Tieni presente che questo filtro personalizzato dovrebbe essere il primo nell'elenco di tutti i filtri applicati (orderBy ecc.) E aggiungerà l' index proprietà aggiuntive (il nome è personalizzabile) in ogni object della raccolta.

Ho iniziato a imparare angular e ho affrontato problemi simili, e in base alla risposta di @ pkozlowski-opensource, l’ho risolto solo con qualcosa di simile

   {{items.indexOf(item)}}  

Prova questo:

 $scope.remove = function(subtask) { var idx = $scope.subtasks.indexOf(subtask), st = $scope.currentTask.subtasks[idx]; // remove from DB SubTask.remove({'subtaskId': subtask.id}); // remove from local array $scope.subtasks.splice(idx,1); } 

Puoi trovare spiegazioni dettagliate in questa voce nel mio blog.

Avrei appena lasciato un commento, ma non ho la “reputazione”.

la soluzione del miglio è esattamente ciò di cui avevo bisogno anche io. Per rispondere alla domanda di pkozlowski.opensource: quando hai nested ngRepeat s, un elenco dinamico (es. Dove permetti le rimozioni), o entrambi (che è il mio caso), usare $index non funziona perché sarà l’indice sbagliato per i dati di back-end dopo l’ordinamento e l’utilizzo di ngInit per memorizzare nella cache il valore non funziona perché non viene rivalutato quando l’elenco cambia.

Si noti che la soluzione di mile consente di personalizzare il nome della proprietà dell’indice collegato passando un parametro

La mia versione ottimizzata:

 .filter( 'repeatIndex', function repeatIndex() { // This filter must be called AFTER 'filter'ing // and BEFORE 'orderBy' to be useful. return( function( array, index_name ) { index_name = index_name || 'index'; array.forEach( function( each, i ) {each[ index_name ] = i;}); return( array ); }); }) 

Nel caso in cui qualcuno debba usare $index , puoi dare un nome all’array ordinato / filtrato:

  

Vedi la mia risposta qui .