Menggunakan $index
berfungsi dengan sangat baik dalam kasus dasar, dan jawaban @ charlietfl sangat bagus. Tetapi terkadang, $index
itu tidak cukup.
Bayangkan Anda memiliki satu array, yang Anda presentasikan dalam dua ng-repeat yang berbeda. Salah satu dari mereka ng-repeat difilter untuk objek yang memiliki properti kebenaran, dan yang lainnya difilter untuk properti palsu. Dua array yang difilter sedang disajikan, yang berasal dari satu array asli. (Atau, jika itu membantu untuk memvisualisasikan: mungkin Anda memiliki satu array orang, dan Anda ingin satu ng-repeat untuk wanita dalam array itu, dan yang lain untuk pria dalam array yang sama .) Tujuan Anda: hapus andal dari array asli, menggunakan informasi dari anggota array yang difilter.
Di setiap array yang difilter, $ index tidak akan menjadi indeks item dalam array asli. Ini akan menjadi indeks dalam sub-array yang difilter . Jadi, Anda tidak akan dapat memberi tahu indeks orang tersebut dalam people
array asli , Anda hanya akan tahu $ index dari women
atau men
sub-array. Cobalah untuk menghapus menggunakan itu, dan Anda akan memiliki item menghilang dari mana-mana kecuali di mana Anda inginkan. Apa yang harus dilakukan?
Jika Anda cukup beruntung menggunakan model data termasuk pengidentifikasi unik untuk setiap objek, kemudian gunakan itu daripada $ indeks, untuk menemukan objek dan splice
keluar dari array utama. (Gunakan contoh saya di bawah ini, tetapi dengan pengenal unik itu.) Tetapi jika Anda tidak seberuntung itu?
Angular sebenarnya menambah setiap item dalam array yang diulang-ulang (dalam array asli dan asli) dengan properti unik yang disebut $$hashKey
. Anda dapat mencari array asli untuk menemukan kecocokan pada $$hashKey
item yang ingin Anda hapus, dan singkirkan seperti itu.
Perhatikan bahwa $$hashKey
ini adalah detail implementasi, tidak termasuk dalam API yang diterbitkan untuk ng-repeat. Mereka dapat menghapus dukungan untuk properti itu kapan saja. Tapi mungkin juga tidak. :-)
$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;
};
});
}
Diminta dengan:
ng-click="deleteFilteredItem(item.$$hashKey, refToSourceArray)"
EDIT: Menggunakan fungsi seperti ini, yang menekan pada $$hashKey
alih - alih nama properti khusus model, juga memiliki keuntungan tambahan yang signifikan membuat fungsi ini dapat digunakan kembali di berbagai model dan konteks yang berbeda. Berikan itu dengan referensi array Anda, dan referensi item Anda, dan itu hanya akan berfungsi.