我正在构建一个具有一种“播放列表”的应用程序.这表示ng-repeated自定义指令,其中ng-repeat =“播放列表中的元素”

因为我想允许用户在播放列表中重复使用相同的元素两次,所以我尝试使用$index添加轨道.

现在,令人困惑的是:当我从播放列表中删除一个元素时(我有一个函数removeElement(index),它基本上包含这样的东西:

$scope.removeElement = function(index){
  $scope.playlist.splice(index,1);
}

发生了一些奇怪的事情:元素已从$scope.playlist中正确删除,但由于某种原因,视图没有正确更新.最后一个元素似乎被删除了.

此外,我无法正确地重新排序数组中的元素.

当我通过$index删除跟踪时,这个问题就消失了,所以我认为这是因为当你从数组中删除一个项目时,如果你只是查看索引,那么看起来你刚刚删除了最后一个.

这种行为很奇怪,因为被剔除的内容被正确删除 – see this plunker

编辑:上面的链接已被修改,以更好地显示问题,并显示我确定的答案.

这个问题也经过了轻微编辑,以便更清楚地了解我的情况. KayakDave下面的答案仍然是正确的,但更适合一系列原语(我原来的plunker特色).

TL; DR:如何在不牺牲控制位置的能力或正确删除元素的情况下将重复元素放入ng-repeat中?

解决方法

使用track by的一个重要性能优势是Angular不会触及跟踪表达式未发生变化的任何DOM元素.对于长ng重复列表而言,这是一个巨大的性能改进,也是增加轨道的原因之一.

性能优化是您所看到的根源.

当你在轨道中使用$index时,你会告诉ng-repeat将它创建的每个DOM元素与第一次ng-repeat运行时的位置($index)联系起来.

所以颜色样式为红色的元素标记为0,橙色1,黄色2 ……最后标记为靛蓝5.

当您删除一个颜色时,Angular会查看您告诉它要跟踪的索引并看到您的索引#5更长(因为您的列表比以前更短).因此,它删除了标记为5-的DOM元素,其具有“indigo”的颜色样式.您仍然有索引#2,因此颜色为黄色的元素会保留.

令人困惑的是,由于数据绑定,DOM元素内的文本确实会更新.因此,当您删除“黄色”时,带有黄色的DOM元素会将文本设置为“绿色”.

简而言之,你所看到的是ng-repeat,因为它的跟踪值(2)仍然存在,但是数据绑定已经更新了该元素内的文本,因此DOM元素的样式保持黄色不变.

要添加具有相同颜色的多个条目,您需要将唯一标识符添加到用于轨道的每个条目中.一种方法是为每个条目使用键值对,其中键是您的唯一标识符.像这样:

$scope.colorlist = {1:'red',2:'orange',3:'yellow',4:'green',5:'blue',6:'indigo',7:'yellow'};

然后按键跟踪如下:

<color-block ng-repeat="(key,color) in colorlist track by key" color="{{color}}" ng-transclude>
    {{color}}
</color-block>

并确保使用该键进行删除选择:

<option value="{{key}}" ng-repeat="(key,color) in colorlist">{{color}}</option>

现在,颜色样式为黄色的DOM元素与您为“黄色”数组元素指定的键相关联.因此,ng-repeat将删除正确的DOM元素,一切正常.

你可以看到它在这里工作:http://plnkr.co/edit/cFaU8WIjliRjPI6LInZ0?p=preview

javascript – 处理ng-repeat中的重复元素的更多相关文章

  1. Angularjs使用ng-repeat中$even和$odd属性的注意事项

    无可否认angularjs的崛起成为前端很大的福利,最近接到项目,框架便选中了angularjs。angularjs最吸引人的地方就是数据的双向绑定和指令了,这篇文章主要介绍了Angularjs中使用ng-repeat的$even和$odd属性的注意事项,需要的朋友可以参考下

  2. Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法

    指令是angular的核心功能之一,用好了事半功倍,监听ng-repeat执行状态仅仅是它功能的冰山一角吧。下面这篇文章主要介绍了Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法,需要的朋友可以参考下。

  3. 关于AngularJS中ng-repeat不更新视图的解决方法

    今天小编就为大家分享一篇关于AngularJS中ng-repeat不更新视图的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. angularjs在ng-repeat中使用ng-model遇到的问题

    本文给大家分享了一个个人在使用angular过程中遇到的在ng-repeat中使用ng-model的问题,并附上简单的解决办法,希望能对大家学习angular有所帮助

  5. AngularJS的ng-repeat指令与scope继承关系实例详解

    这篇文章主要介绍了AngularJS的ng-repeat指令与scope继承关系,结合实例形式通过ng-repeat指令详细分析了scope继承关系,需要的朋友可以参考下

  6. ng-repeat指令在迭代对象时的去重方法

    今天小编就为大家分享一篇ng-repeat指令在迭代对象时的去重方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  7. angularjs下ng-repeat点击元素改变样式的实现方法

    今天小编就为大家分享一篇angularjs下ng-repeat点击元素改变样式的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  8. Angularjs中ng-repeat的简单实例

    这篇文章主要介绍了Angularjs中ng-repeat的简单实例的相关资料,这里提供两个实例方法帮助大家彻底掌握这部分内容,需要的朋友可以参考下

  9. AngularJS ng-repeat数组有重复值的解决方法

    不知道大家是否遇到过这个问题,在当Angular.JS ng-repeat数组中有重复项时,系统就会抛出异常,这是该怎么做?本文通过示例代码介绍了详细的解决方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。

  10. angularJs使用ng-repeat遍历后选中某一个的方法

    今天小编就为大家分享一篇angularJs使用ng-repeat遍历后选中某一个的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部