Використання $index
працює чудово в основних випадках, і відповідь @ charlietfl чудова. Але іноді $index
недостатньо.
Уявіть, що у вас є один масив, який ви представляєте у двох різних ng-повторах. Один з цих ng-повторів фільтрується для об'єктів, які мають властивість truthy, а інший фільтрується за хибною властивістю. Представлено два різних відфільтрованих масиви, які походять від одного вихідного масиву. (Або якщо це допомагає візуалізувати: можливо, у вас є один масив людей, і ви хочете один ng-повторення для жінок у цьому масиві, а інший для чоловіків у тому ж масиві .) Ваша мета: надійно видалити з оригінальний масив, використовуючи інформацію від членів відфільтрованих масивів.
У кожному з цих відфільтрованих масивів $ index не буде індексом елемента в початковому масиві. Це буде індекс у відфільтрованому підмасиві . Отже, ви не зможете вказати індекс людини в початковому people
масиві, ви будете знати лише індекс $ з масиву women
або men
підмасиву. Спробуйте видалити за допомогою цього, і у вас зникнуть предмети звідусіль, окрім того, де ви хотіли. Що робити?
Якщо вам пощастило, що використання моделі даних включає в себе унікальний ідентифікатор для кожного об'єкта, тоді використовуйте це замість $ index, щоб знайти об'єкт і splice
його з головного масиву. (Використовуйте мій приклад нижче, але з цим унікальним ідентифікатором.) Але якщо вам не так пощастило?
Angular насправді збільшує кожен елемент у ng-повторюваному масиві (в основному, оригінальному масиві) з унікальною властивістю, що називається $$hashKey
. Ви можете шукати оригінальний масив на відповідність $$hashKey
елементу, який ви хочете видалити, і позбутися його таким чином.
Зауважте, що $$hashKey
це детальна інформація про реалізацію, не включена до опублікованого API для ng-повторів. Вони можуть будь-коли видалити підтримку цього ресурсу. Але, мабуть, ні. :-)
$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;
};
});
}
Надіслати:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
РЕДАКТУВАННЯ: Використання такої функції, яка натискає $$hashKey
замість назви властивості, що відповідає конкретній моделі, також має значну додаткову перевагу - зробити цю функцію багаторазовою для використання в різних моделях та контекстах. Надайте його своїм посиланням на масив та посиланням на ваш елемент, і він повинен просто працювати.