sort orderby number multiple index fields ascending angularjs sorting indexing angularjs-orderby

orderby - order by number angularjs



Angularjs índice incorrecto $ después de la ordenBy (6)

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

<a> <img src="img/delete.png" ng-click="removeItem(items.indexOf(item))"> {{items.indexOf(item)}} </a>

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 alcance y no en la vista? ¿Como hacer eso?

Aquí hay un código relevante:

En la vista:

<tr ng-repeat="item in items | orderBy:''Store.storeName''"> <td><input class="toggle" type="checkbox" ng-model="item.Completed"></td> <td>{{item.Name}}</td> <td>{{item.Quantity}} Stk.</td> <td>{{item.Price || 0 | number:2}} €</td> <td>{{item.Quantity*item.Price|| 0 | number:2}} €</td> <td>{{item.Store.storeName}}</td> <td><a><img src="img/delete.png" ng-click="removeItem($index)">{{$index}}</a></td> </tr>

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 caso de que alguien necesite usar $index , puede darle un nombre a la matriz ordenada / filtrada:

<tr ng-repeat="item in sortedItems = (items | orderBy:''Store.storeName'') track by $index">

Vea mi respuesta here .


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 :

<a><img src="img/delete.png" ng-click="removeItem(item)">{{$index}}</a>

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


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 anidado 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 <tr ng-repeat="item in items | index:''originalPosition'' | orderBy:''Store.storeName''">

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


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.


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:

<tr ng-repeat="item in items | index | orderBy:''Store.storeName''">

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.