基本的なケースでは使用$index
は完全にうまく機能し、@ charlietflの答えは素晴らしいです。しかし、時には、十分で$index
はありません。
2 つの異なる ng-repeat で提示している単一の配列があるとします。これらの ng-repeat の 1 つは、真のプロパティを持つオブジェクトに対してフィルター処理され、もう 1 つは偽のプロパティに対してフィルター処理されます。1 つの元の配列から派生した 2 つの異なるフィルター処理された配列が提示されています。(または、視覚化するのに役立つ場合: おそらく、単一の人の配列があり、その配列の女性用に 1 つの ng-repeat が必要で、同じ配列の男性用に別の ng-repeat が必要です。) あなたの目標: から確実に削除しますフィルタリングされた配列のメンバーからの情報を使用して、元の配列。
これらのフィルタリングされた配列のそれぞれで、 $index は元の配列内のアイテムのインデックスにはなりません。フィルタリングされたサブ配列のインデックスになります。そのため、元の配列で人のインデックスを知ることはできません。またはサブ配列people
からの $index しかわかりません。それを使用して削除しようとすると、必要な場所以外の場所からアイテムが消えます。何をすべきか?women
men
幸運にも、データ モデルに各オブジェクトの一意の識別子が含まれている場合は、$index の代わりにそれを使用してsplice
、メイン配列からオブジェクトとそれを見つけます。(以下の私の例を使用してください。ただし、その一意の識別子を使用します。) しかし、運が悪かった場合はどうなりますか?
Angular は、実際には ng 反復配列 (メインの元の配列) 内の各項目を、 と呼ばれる一意のプロパティで拡張します$$hashKey
。元の配列で、$$hashKey
削除したい項目の一致を検索し、その方法でそれを取り除くことができます。
これ$$hashKey
は実装の詳細であり、公開されている ng-repeat の API には含まれていないことに注意してください。そのプロパティのサポートはいつでも削除できます。しかし、おそらくそうではありません。:-)
$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)"
EDIT:モデル固有のプロパティ名の代わりにキーを押すこのような関数を使用する$$hashKey
と、この関数をさまざまなモデルやコンテキストで再利用できるという大きな利点があります。配列参照とアイテム参照を提供すると、うまくいくはずです。