Kullanımı $index
temel durumlarda mükemmel çalışır ve @ charlietfl'in cevabı harika. Ancak bazen,$index
yeterli olmaz.
İki farklı tekrarda sunduğunuz tek bir diziniz olduğunu düşünün. Bu tekrarlardan biri, gerçek bir özelliğe sahip nesneler için filtrelenir ve diğeri, bir sahte özellik için filtrelenir. Tek bir orijinal diziden türetilen iki farklı filtrelenmiş dizi sunulmaktadır. (Ya da görselleştirmeye yardımcı oluyorsa: belki de tek bir kişiden oluşan bir diziniz vardır ve bu dizideki kadınlar için bir ng ve aynı dizideki erkekler için başka bir ng tekrar etmek istersiniz .) Hedefiniz: Orijinal dizi, filtrelenmiş dizilerin üyelerinden gelen bilgileri kullanarak.
Filtrelenen dizilerin her birinde, $ index, orijinal dizideki öğenin dizini olmaz. Bu dizin olacak süzülmüş alt-dizide . Böylece, kişinin dizinini orijinal people
dizide söyleyemezsiniz, yalnızca $ dizinini women
veyamen
alt diziden . Bunu kullanarak silmeyi deneyin, istediğiniz yerde hariç her yerden öğeler kaybolur. Ne yapalım?
Her nesne için benzersiz bir tanımlayıcı içeren bir veri modeli kullanmakta yeterince şanslıysanız, nesneyi bulmak için $ index yerine splice
onu ana dizinin dışında . (Aşağıdaki örneğimi kullanın, ancak bu benzersiz tanımlayıcı ile.) Ama çok şanslı değilseniz?
Açısal, ng yinelenen bir dizideki (ana, orijinal dizide) her öğeyi benzersiz bir özellik ile artırır $$hashKey
. Orijinal dizide eşleşme için arama yapabilirsiniz.$$hashKey
silmek istediğiniz öğenin bu şekilde ondan kurtulabilirsiniz.
$$hashKey
Ng-tekrar için yayınlanmış API'da bulunmayan bir uygulama ayrıntısı olduğunu unutmayın . Bu mülke verilen desteği istedikleri zaman kaldırabilirler. Ama muhtemelen hayır. :-)
$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;
};
});
}
Şununla ara:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
DÜZENLEME: $$hashKey
Modele özgü özellik adı yerine kullanılan tuşlar gibi bir işlev kullanmak, bu işlevi farklı modellerde ve bağlamlarda yeniden kullanılabilir hale getirme avantajına da sahiptir. Dizi referansınızı ve öğe referansınızı sağlayın ve sadece işe yarayacaktır.