私はtrack by $index
を使用しています。なぜなら、配列内に繰り返し要素を許可したいからです。同時に、このコレクションから要素を削除するときに副作用が発生します。
私はコントローラーで$scope.players = []
と宣言されているこのプレーヤーのセットを持っています。
<input type="text" ng-model="player">
<button ng-click="addPlayer()">
addPlayer()
はちょうどplayers
配列にplayer
モデルをプッシュ:
$scope.addPlayer = function() {
if (!$scope.player)
return;
$scope.players.push($scope.player);
$scope.player = null;
};
を、コレクションには、ng-repeat
を使用して示されている
次のようにして、この配列を移入することができます。しかし、アイテムをクリックしたときにも削除する必要があります。
<div ng-repeat="player in players track by $index" ng-click="deletePlayer($index)">
{{player}}
</div>
$scope.deletePlayer = function(index) {
if (index > -1)
$scope.players.splice(index, 1);
};
問題は、要素がコレクションが変更されたため、選手たちのコレクションは1で短くなります削除されたとき以来、それは、インデックスによって追跡だということです。
私がこれを意味するのは、次のとおりです。プレイヤーの配列["p1", "p2", "p3"]
があるとします。 p1
などの最後のものを除いてこれらのうちの1つを削除すると、p3
が表示されますが、と表示されていても、は[p2, p3]
と表示されません。これは、コレクションが1つの要素が短いと言うとき、私が意味することです。
track by $index
モードのng-repeat
では、配列の長さが変更されていないため、問題が発生したと思います。したがって、変更された配列を反復処理する際に、古いインデックスを使用しているため、1つの要素をスキップしています。
この副作用に対処する標準的な方法はありますか?
「コレクションが変更されたため、プレイヤーのコレクションが削除されました」という説明がありますか?アイテムをスプライスした後、またはその前に? –
はい、私の質問を編集させてください。 – dabadaba