Angularjs 重新排列阵列时,如何使用角度动画触发ng移动?
使用角度1.2.4 我试图弄清楚当重复的项目被重新排序时,如何触发ng animate的移动。我知道ng动画正在工作,因为当应用过滤器时,enter、leave和move的动画都会被触发。但是,当我使用一些数组方法对数组重新排序时,不会触发任何动画。 我怀疑问题的一部分在于,我实际上是使用此方法将元素移除并添加到数组中,而不是真正“移动”它们:Angularjs 重新排列阵列时,如何使用角度动画触发ng移动?,angularjs,ng-animate,Angularjs,Ng Animate,使用角度1.2.4 我试图弄清楚当重复的项目被重新排序时,如何触发ng animate的移动。我知道ng动画正在工作,因为当应用过滤器时,enter、leave和move的动画都会被触发。但是,当我使用一些数组方法对数组重新排序时,不会触发任何动画。 我怀疑问题的一部分在于,我实际上是使用此方法将元素移除并添加到数组中,而不是真正“移动”它们: $scope.moveDown = function(order){ var temp = $scope.names[order];
$scope.moveDown = function(order){
var temp = $scope.names[order];
$scope.names.splice(order, 1);
$scope.names.splice(order+1, 0, temp);
}
下面是一个plunker,它显示了我在做什么:
单击任意名称,使其在列表中向下移动
有没有办法在不拼接的情况下对阵列重新排序?或者在项目的$index发生变化时手动触发移动动画?尝试在移除和插入之间留出一个间隙(在消化过程中),这将使ng enter
和ng leave
动画生效
var temp = $scope.names.splice(order, 1).pop();
$timeout(function(){
$scope.names.splice(order+1, 0, temp);
});
如果要避免使用超时,请稍微重新构造数据,使其成为对象数组(无论如何,这总是可取的),然后执行以下操作:-
视图模型:-
$scope.names = [{'name':'Igor Minar'}, {'name':'Brad Green'}, {'name':'Dave Geddes'}, {'name':'Naomi Black'}, {'name':'Greg Weber'}, {'name':'Dean Sofer'}, {'name':'Wes Alvaro'}, {'name':'John Scott'}, {'name':'Daniel Nadasi'}];
在处理程序中:-
$scope.moveDown = function(order){
var itm = $scope.names.splice(order+1, 1).pop(); //Get the item to be removed
$scope.names.splice(order, 0, angular.copy(itm)); //use angular.clone to get the copy of item with hashkey
}
这里有两件事很重要,您需要使用angular.clone,以便从移动项目中删除默认跟踪器属性($$hashkey
),这似乎只有在删除项目并插入新项目时(基于跟踪器属性)angular才会向其添加动画类。您不能像最初那样使用primitive
谢谢!通过一点捣乱使动画看起来像是在向下移动:@tim这也正是我以前尝试过的,然后我就反对它了……)你最后做了什么作为替代?使用$timeout对我来说总是有点不方便使用
$timeout
总是一种不方便的方法,它只是用来将添加操作延迟到下一个摘要周期,以便动画发生但是,如果您一起执行,那么相同的摘要周期将执行数组中相同项的删除和添加,并且不会添加任何类。我会在有时间的时候尝试一下。@tim你看过更新了吗?你对此满意吗?