Использование $index
отлично работает в основных случаях, и ответ @ charlietfl великолепен. Но иногда $index
этого недостаточно.
Представьте, что у вас есть один массив, который вы представляете в двух разных ng-repeat. Один из этих ng-repeat фильтруется для объектов, имеющих свойство truey, а другой - для свойства false. Представлены два разных отфильтрованных массива, которые происходят из одного исходного массива. (Или, если это помогает визуализировать: возможно, у вас есть один массив людей, и вам нужно одно ng-повторение для женщин в этом массиве и другое для мужчин в этом же массиве .) Ваша цель: надежно удалить из исходный массив, использующий информацию от членов отфильтрованных массивов.
В каждом из этих отфильтрованных массивов $ index не будет индексом элемента в исходном массиве. Это будет индекс в отфильтрованном подмассиве . Таким образом, вы не сможете узнать индекс человека в исходном people
массиве, вы будете знать только индекс $ из подмассива women
или men
. Попробуйте удалить, используя это, и у вас будут предметы, исчезающие отовсюду, за исключением того, что вы хотели. Что делать?
Если вам повезло, вы используете модель данных, содержащую уникальный идентификатор для каждого объекта, а затем используйте его вместо $ index, чтобы найти объект и splice
его значение вне основного массива. (Используйте мой пример ниже, но с этим уникальным идентификатором.) Но если вам не так повезло?
Angular фактически увеличивает каждый элемент в массиве с повторением ng (в основном, исходном массиве) уникальным свойством, которое называется $$hashKey
. Вы можете найти в исходном массиве совпадение с $$hashKey
элементом, который хотите удалить, и таким образом избавиться от него.
Обратите внимание, что $$hashKey
это деталь реализации, не включенная в опубликованный API для ng-repeat. Они могут удалить поддержку этого свойства в любое время. Но, вероятно, нет. :-)
$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
вместо имени специфичного для модели ключа используется ключ , также имеет существенное дополнительное преимущество, заключающееся в возможности многократного использования этой функции в различных моделях и контекстах. Укажите в нем ссылку на массив и ссылку на элемент, и она должна просто работать.