ng使用'跟踪$index'在ng重复中
ng-animate animate wrong item when using 'track by $index' in ng-repeat
我正在尝试创建一个应用程序,用户可以选择不同类型的块,并将它们堆叠在一起以创建唯一的模板。
由于我希望用户能够多次将同一块添加到模板中,我必须使用"trackby$index"来实现这一点:
<li ng-repeat="chosen in chosenlist track by $index">
但是,当我尝试使用ng animate添加动画时,用于移除块的动画在模板中的最后一个块上而不是移除块上设置动画。我把代码放在jsfiddle这里http://jsfiddle.net/FC9c7/6/.
尝试通过选择布局1、2或3来添加新块。当您单击"删除块"时,您将看到问题。
以下是我认为正在发生的事情:由于您正在根据项目的索引跟踪项目,每次从列表中删除一个项目时,更改的是最后一个元素的索引,使Angular相信它就是被删除的那个。当您在其元素旁边打印索引时,这一点就变得很明显了。看看这个修改后的jsFiddle。
一种解决方案是创建具有唯一id的新元素,然后通过这些id进行跟踪:
Javascript
$scope.add_layout = function(new_layout) {
new_layout = angular.copy(new_layout);
new_layout.id = new Date().getUTCMilliseconds();
$scope.chosenlist.push(new_layout);
};
HTML
<li ng-repeat="chosen in chosenlist track by chosen.id" ng-animate="'animate'">
jsFiddle在这里。
但由于它创建了新的元素,您将无法使它们与原始对象保持同步,我不知道这是否可以接受。
我将尝试检查Angular 1.2 RC1中的新动画系统是否解决了这个特定的问题,如果我发现了什么,我将更新这个答案。但我不相信它会这样(
在将对象添加到所选列表之前,您可以复制该对象。通过这种方式,您可以通过$id(已选择)进行跟踪,这是默认值。您正在将相同的对象添加到所选列表中,因此angular将在中继器中看到重复的ng repeat。
更改addlayout函数如下,并删除ng repeat中的track-by-expression。这只是另一个解决方案。在大型对象中,执行深度复制可能没有意义。
$scope.add_layout = function(new_layout) {
$scope.chosenlist.push(angular.copy(new_layout));
};
- 动态分配GA增强型电子商务跟踪器
- ng映射方向备选方案
- AngularJS UI路由器不能像ng路由器那样工作
- 角度:在ng重复上切换图像
- 跟踪在页面加载时应用内联样式的JavaScript
- 正在使用$location.path(.)路由ng视图
- AngularJS:ng之后,重复$scope值未按预期更新
- ng打开空字符串
- Angular.js通过对象关键点上的ng选项进行跟踪
- Angular JS ng-repeat - 按动态集合跟踪
- 通过ID工作进行ng重复跟踪,如何在ng重复中过滤
- ng使用'跟踪$index'在ng重复中
- 一般角度ng重复并按$index跟踪
- ng选项,带有跟踪依据和过滤器
- DOM不断重建与角度选择ng重复和跟踪
- Ng-options按问题跟踪
- 角递归ng-include,同时跟踪递归深度
- 在嵌套的ng-repeat中通过$index跟踪的最佳方法是什么?
- 绑定谷歌分析事件跟踪ng-click
- 当按值跟踪发生变化时,如何重建ng-repeat