Angularjs mal l’indice $ après la commandePar

Je suis nouveau sur Angular.js et j’ai du mal à sortinger mon tableau et à travailler sur ces données sortingées.

J’ai une liste avec des articles et je veux la sortinger par “Store.storeName”, qui fonctionne jusqu’à présent. Mais après avoir sortingé les données, ma fonction de suppression ne fonctionne plus. Je pense que c’est parce que l’index $ est incorrect après le sorting, et que les mauvaises données sont supprimées.

Comment puis-je résoudre ce problème? Commander les données dans la scope et non dans la vue? Comment faire ça?

Voici un code pertinent:

Dans la vue:

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

Et dans mon contrôleur, j’ai cette fonction de suppression, qui devrait supprimer les données spécifiques:

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

Cela fonctionne bien avant de commander dans la vue. Si quelque chose d’important manque, s’il vous plaît laissez-moi maintenant.

Merci!

Au lieu de cela ou en relayant sur l’ $index – qui – comme vous l’avez remarqué – pointera sur l’index dans un tableau sortingé / filtré, vous pouvez transmettre l’élément lui-même à votre fonction removeItem :

 {{$index}} 

et modifiez la fonction removeItem pour rechercher un index utilisant la méthode indexOf d’un tableau comme suit:

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

J’ai eu le même problème et d’autres réponses à ce sujet ne sont pas adaptées à ma situation.

J’ai résolu mon problème avec un filtre personnalisé:

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

qui peut être utilisé de cette façon:

  

et puis en HTML, vous pouvez utiliser item.index au lieu de $index .

Cette méthode convient aux collections d'objects.

Veuillez tenir compte du fait que ce filtre personnalisé doit être le premier de la liste de tous les filtres appliqués (orderBy, etc.) et il appenda l' index propriété supplémentaire (le nom est personnalisable) dans chaque object de la collection.

J’ai commencé à apprendre angularment et fait face à des problèmes similaires, et sur la base de la réponse de @ pkozlowski-opensource, je l’ai résolu avec juste quelque chose comme

   {{items.indexOf(item)}}  

Essaye ça:

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

Vous pouvez trouver des explications détaillées dans cette entrée sur mon blog.

J’aurais juste laissé un commentaire, mais je n’ai pas la “réputation”.

La solution de mile est exactement ce dont j’avais aussi besoin. Pour répondre à la question de pkozlowski.opensource: lorsque vous avez soit nested ngRepeat , une liste dynamic (par exemple, où vous autorisez les suppressions), soit les deux (ce qui est mon cas), l’utilisation de $index ne fonctionnera pas. Les données d’arrière-plan après le sorting et l’utilisation de ngInit pour mettre en cache la valeur ne fonctionnent pas non plus car elles ne sont pas réévaluées lorsque la liste change.

Notez que la solution de mile permet de personnaliser le nom de la propriété d’index attachée en transmettant un paramètre

Ma version modifiée:

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

Si quelqu’un doit utiliser $index , vous pouvez donner un nom au tableau sortingé / filtré:

  

Voir ma réponse ici .