用于ngAnimate的回调的速度动画

时间:2015-02-27 09:03:02

标签: javascript angularjs velocity.js

我尝试使用速度和角度来制作假动画,这样当桌子行离开时它们会向右移动。

在示例中,我使用离开回调来尝试动画离开ng-repeat,但回调运行却没有任何反应!



angular.module('myApp', ['ngAnimate'])
  .controller('myCtrl', function($scope) {
    $scope.items = ['item1', 'item2', 'item3']
    
    $scope.shiftItems = function() {
     var items = ['asdf', 'bill', 'bob', 'joe', 'items']
     
     for (var i = 0; i < $scope.items.length; i++)
       $scope.items.shift()
      
     for (var i = 0; i < items.length; i++)
       $scope.items.push(items[i])
    }
  })

.animation('.velocity-tableSlideInOut', [function() {
    return {
      enter: function(element, done) {
         Velocity(element, 'transition.slideLeftIn', [0.36, 0.96, 0.6, 0.96])
       },

      leave: function(element) {
        Velocity(element, {opacity: 0}, [0.4, 0.04, 0.64, 0.04])
      }
    }
  }])
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.2/velocity.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.2/velocity.ui.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.14/angular-animate.js"></script>
<div ng-app='myApp'>
  <ul ng-controller='myCtrl'>
    <li class='velocity-tableSlideInOut' ng-repeat='item in items track by $index'>
      {{item}}
    </li>
    <li>
      <button ng-click='shiftItems()'>Reorder</button>
    </li>
  </ul>
  
  
</div>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

这实际上是使用track by $index时的预期行为。

您从3个项目开始,索引将是:

0 1 2

删除这3项,添加6项新项目,现在有索引:

0 1 2 3 4 5

没有索引,所以不会触发任何动画。但是有3个新索引,因此将为索引为3,4和5的项触发输入动画。

解决方案是跳过track by或跟踪与对象实际相关的属性,例如唯一ID。如果您的集合只包含字符串并且您需要支持重复项,则需要将它们包装在对象中,例如:

{ value: 'item1' }

演示http://plnkr.co/edit/tRZ7L0CAfFMKgSSyyYk5?p=preview