Sử dụng $index
hoạt động hoàn toàn tốt trong các trường hợp cơ bản và câu trả lời của @ charlietfl là tuyệt vời. Nhưng đôi khi,$index
không đủ.
Hãy tưởng tượng bạn có một mảng duy nhất, mà bạn đang trình bày ở hai ng-repeat khác nhau. Một trong những ng-repeat đó được lọc cho các đối tượng có thuộc tính trung thực và đối tượng kia được lọc cho thuộc tính giả. Hai mảng được lọc khác nhau đang được trình bày, xuất phát từ một mảng gốc duy nhất. (Hoặc, nếu nó giúp hình dung: có lẽ bạn có một mảng người và bạn muốn một lần lặp lại cho phụ nữ trong mảng đó và một lần nữa cho những người đàn ông trong cùng một mảng .) Mục tiêu của bạn: xóa đáng tin cậy khỏi mảng ban đầu, sử dụng thông tin từ các thành viên của các mảng được lọc.
Trong mỗi mảng được lọc, $ index sẽ không phải là chỉ mục của mục trong mảng ban đầu. Nó sẽ là chỉ mục trong mảng con được lọc . Vì vậy, bạn sẽ không thể nói chỉ mục của người đó trong people
mảng ban đầu , bạn sẽ chỉ biết chỉ số $ từ women
hoặcmen
mảng mảng phụ. Cố gắng xóa bằng cách sử dụng và bạn sẽ có các mục biến mất từ mọi nơi trừ nơi bạn muốn. Phải làm sao?
Nếu bạn đủ may mắn khi sử dụng mô hình dữ liệu bao gồm một mã định danh duy nhất cho từng đối tượng, thì hãy sử dụng mô hình đó thay vì $ index, để tìm đối tượng và splice
nó ra khỏi mảng chính. (Sử dụng ví dụ của tôi dưới đây, nhưng với định danh duy nhất đó.) Nhưng nếu bạn không may mắn như vậy?
Angular thực sự tăng từng mục trong một mảng lặp lại ng (trong mảng chính, mảng gốc) với một thuộc tính duy nhất được gọi $$hashKey
. Bạn có thể tìm kiếm mảng ban đầu cho một trận đấu trên$$hashKey
mục bạn muốn xóa và loại bỏ nó theo cách đó.
Lưu ý rằng $$hashKey
là một chi tiết triển khai, không được bao gồm trong API được xuất bản cho ng-repeat. Họ có thể loại bỏ hỗ trợ cho tài sản đó bất cứ lúc nào. Nhưng có lẽ là khô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;
};
});
}
Gọi với:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
EDIT: Sử dụng một chức năng như thế này, phím nào $$hashKey
thay vì tên thuộc tính dành riêng cho mô hình, cũng có lợi thế đáng kể về việc làm cho chức năng này có thể sử dụng lại trên các mô hình và bối cảnh khác nhau. Cung cấp cho nó với tham chiếu mảng của bạn, và tham chiếu mục của bạn, và nó sẽ chỉ hoạt động.