O uso $index
funciona perfeitamente bem em casos básicos, e a resposta do @ charlietfl é ótima. Mas, às vezes, $index
não é suficiente.
Imagine que você tem uma única matriz, que você está apresentando em duas repetições ng diferentes. Um desses ng-repeat's é filtrado para objetos que possuem uma propriedade de verdade e o outro é filtrado para uma propriedade false. Duas matrizes filtradas diferentes estão sendo apresentadas, que derivam de uma única matriz original. (Ou, se ajudar a visualizar: talvez você tenha uma única matriz de pessoas e deseje uma repetição de ng para as mulheres dessa matriz e outra para os homens dessa mesma matriz .) Seu objetivo: excluir com segurança o matriz original, usando informações dos membros das matrizes filtradas.
Em cada uma dessas matrizes filtradas, $ index não será o índice do item na matriz original. Será o índice no sub-array filtrado . Portanto, você não será capaz de informar o índice da pessoa na people
matriz original , apenas conhecerá o índice $ da women
ou men
sub-matriz. Tente excluir usando isso, e você terá itens desaparecendo de todos os lugares, exceto onde você queria. O que fazer?
Se você tiver a sorte de usar um modelo de dados, inclua um identificador exclusivo para cada objeto, use-o em vez de $ index, para encontrar o objeto e splice
ele fora da matriz principal. (Use meu exemplo abaixo, mas com esse identificador exclusivo.) Mas se você não tiver tanta sorte?
Angular na verdade aumenta cada item em uma matriz ng-repetida (na matriz original principal) com uma propriedade exclusiva chamada $$hashKey
. Você pode pesquisar na matriz original por uma correspondência $$hashKey
do item que deseja excluir e se livrar dessa maneira.
Observe que este $$hashKey
é um detalhe de implementação, não incluído na API publicada para ng-repeat. Eles podem remover o suporte para essa propriedade a qualquer momento. Mas provavelmente não. :-)
$scope.deleteFilteredItem = function(hashKey, sourceArray){
angular.forEach(sourceArray, function(obj, index){
// sourceArray is a reference to the original array passed to ng-repeat,
// rather than the filtered version.
// 1. compare the target object's hashKey to the current member of the iterable:
if (obj.$$hashKey === hashKey) {
// remove the matching item from the array
sourceArray.splice(index, 1);
// and exit the loop right away
return;
};
});
}
Invocar com:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
EDIT: O uso de uma função como essa, que digita o $$hashKey
nome da propriedade em vez de um nome de propriedade específico do modelo, também tem a vantagem adicional de tornar essa função reutilizável em diferentes modelos e contextos. Forneça sua referência de matriz e referência de item, e deve funcionar.