Angularjs índice incorrecto $ después de la ordenBy

Soy nuevo en Angular.js y tengo algunos problemas para ordenar mi matriz y trabajar en los datos ordenados.

Tengo una lista con elementos y quiero ordenarla por “Store.storeName”, que está funcionando hasta el momento. Pero después de ordenar los datos, mi función de eliminación ya no funciona. Creo que eso se debe a que el índice $ es incorrecto después de la clasificación, por lo que se eliminan los datos incorrectos.

¿Cómo puedo resolver eso? Ordenar los datos en el scope y no en la vista? ¿Como hacer eso?

Aquí hay un código relevante:

En la vista:

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

Y en mi controlador tengo esta función de eliminación, que debería eliminar los datos específicos:

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

Esto funciona bien antes de ordenar en la Vista. Si falta algo importante, déjame ahora.

¡Gracias!

En su lugar, o retransmitir en el $index que, como habrás notado, apuntará al índice en una matriz ordenada / filtrada, puedes pasar el elemento a tu función removeItem :

 {{$index}} 

y modifique la función removeItem para encontrar un índice utilizando el método indexOf de una matriz de la siguiente manera:

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

Tuve el mismo problema y otras respuestas en este tema no son adecuadas para mi situación.

He resuelto mi problema con filtro personalizado:

 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; }; }); 

que se puede usar de esta manera:

  

y luego en HTML puede usar item.index lugar de $index .

Este método es adecuado para las colecciones de objetos.

Tenga en cuenta que este filtro personalizado debe ser el primero en la lista de todos los filtros aplicados (orderBy, etc.) y agregará el index propiedad adicional (el nombre es personalizable) en cada objeto de la colección.

Empecé a aprender problemas angulares y similares, y en función de la respuesta de @ pkozlowski-opensource, lo resolví con algo así como

   {{items.indexOf(item)}}  

Prueba esto:

 $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); } 

Puede encontrar una explicación detallada en esta entrada en mi blog.

Hubiera dejado un comentario, pero no tengo la “reputación”.

La solución de mile es exactamente lo que necesitaba también. Para responder a la pregunta de pkozlowski.opensource: cuando has nested ngRepeat , una lista dinámica (por ejemplo, donde permites las eliminaciones) o ambas (que es mi caso), usar $index no funciona porque será un índice incorrecto para el Los datos de back-end después de ordenar y usar ngInit para almacenar en caché el valor tampoco funcionan porque no se vuelven a evaluar cuando la lista cambia.

Tenga en cuenta que la solución de milla permite que el nombre de propiedad del índice adjunto se personalice al pasar un parámetro

Mi versión retocada:

 .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 ); }); }) 

En caso de que alguien necesite usar $index , puede darle un nombre a la matriz ordenada / filtrada:

  

Vea mi respuesta aquí .