我正在构建一个具有“播放列表”特征的应用程序。这是一个ng重复的自定义指令ng-repeat = "element in playlist"
处理ng-repeat中的重复元素
因为我想允许用户在播放列表中重复使用两次相同的元素,我尝试使用track by $index
加法。
现在,有什么困惑的是:当我从播放列表中删除一个元素(我有一个功能removeElement(index)
基本上包含了这样的事情:
$scope.removeElement = function(index){
$scope.playlist.splice(index, 1);
}
奇怪的事情发生了:从正确删除的元素$scope.playlist
,但由于某些原因的看法并不正确更新。最后一个元素似乎被删除。
而且,我无法正确地重新排序数组中的元素无论是。
当我删除track by $index
这个问题消失了,所以我认为这是因为当你从数组中删除一个项目时,如果你只查看索引,那么看起来你刚刚删除了最后一个。
的行为是奇怪,但因为transcluded内容被删除正确 - see this plunker
编辑:上面的链接已被修改,以更好地说明问题,也表明我看中了答案。
这个问题也经过了微小的修改,使得它更清晰。下面的KayakDave的答案仍然是正确的,但更适合于一系列基元(我的原始蹦极功能)。
TL; DR:如何在不牺牲控制位置或删除元素的能力的情况下将重复元素放入ng-repeat
?
你可以发布更新的重播器吗?看起来这会导致相同的问题 - 因为它似乎不是问题是集合/对象键,但它与'$ index'相关,我希望它仍然不匹配。所以我很好奇,看看我错过了什么。它可以帮助其他与您发布相同问题的人更好地了解您的解决方案。 – KayakDave
你是对的 - 我在这里忽略的一点是,这是使用'track by $ index'的替代方案。对于原语需要'track by $ index',但对于我的帖子中的播放列表示例,复制要包含两次的轨道比通过索引进行跟踪更有意义(因为重新排序是非常可能的要求)。 –
现在有道理。感谢更新。如果你有时间,你可能会调整一些问题 - 现在你将你的问题总结为“如果你正在使用$ index索引,你如何正确地从ng-repeat数组中移除一个元素?”我认为你现在正在回答更广泛的问题。就这样,这一切都有助于后代:) – KayakDave