【发布时间】:2014-07-22 00:14:16
【问题描述】:
我有一个项目列表,每个项目都有一个唯一的 id
$scope.arr = [{val:0,id:'a'},{val:1,id:'b'},{val:2,id:'c'}];
每个项目都根据它们的 $index 进行绝对定位
<div class="item" ng-repeat="item in arr track by item.id"
ng-style="getAbsPos($index)" >{{item.id}}</div>
我想要的只是在数组中交换arr[0] 和arr[2],并显示这个动作的移动动画。事实证明这非常困难。
我认为这个 css 可以工作,因为列表是由 id 跟踪的
.item{
transition:all 3000ms;
}
但不知何故,角度决定只移动一个项目的dom并重新创建另一个(为什么?!)。结果,只有一个项目是动画的。
= 问题 =
是否有解决此问题的解决方案,因此两个项目在交换时都会被动画化?谢谢。
(必须实际交换项目在数组中的位置,以便始终通过正确的索引轻松访问)
= 查看 Plunker 演示 =
【问题讨论】:
-
@Blackhole 嗨,谢谢。我的情况实际上需要重新排序数组,提供的解决方案似乎通过向每个项目添加额外的位置信息来伪造重新排序。
-
哦,其实其他问题也没有很好的解决办法;)。实际上,它看起来像一个错误(see this comment,它完美地描述了您的用例)。
-
在玩 Plunker 时,我得到了这个:plnkr.co/edit/npxFVh9FII0akVj6lIwp?p=preview - 如果你有 DOM 元素检查器,并在动画完成前多次单击按钮,你会看到额外的 DOM 节点添加...奇怪的行为。这无济于事,但会显示相关的意外行为。
-
@J.Bruni 这似乎是 ngAnimate 模块的特性,它会根据 css 转换值自动为 dom 更改添加延迟。
标签: javascript angularjs ng-animate