gpt4 book ai didi

angularjs - 在 ng-repeat 动画之前将 Angular ng-class 设置为 $apply

转载 作者:行者123 更新时间:2023-12-01 02:19:23 26 4
gpt4 key购买 nike

我有一个动画,它根据单击的按钮向左或向右移动 ng-repeat 中的元素。

在一次操作中,我设置了一个 ng-class(动画类),然后删除了触发动画的元素,但在应用动画之前它似乎无法识别对 ng-class 的更改,除非我使用$scope.$apply() ,但这会引发 $apply already in progress错误。有没有办法不用$scope.$apply() ,或摆脱那个错误?

这是工作 fiddle (有错误)。 http://jsfiddle.net/noducks/6pFr2/

HTML

<div ng-controller="MyCtrl" style="text-align: center">
<div ng-repeat="elem in elements" ng-class="elem.anim">
<button ng-click="out(elem, 'left', $index)">Left</button>
<button ng-click="out(elem, 'right', $index)">Right</button>
</div>
</div>

Javascript
var myApp = angular.module('myApp',['ngAnimate']);

function MyCtrl($scope) {
$scope.elements = [
{anim: ''},
{anim: ''},
{anim: ''},
{anim: ''},
{anim: ''}
];

$scope.out = function(elem, direc, index) {
elem.anim = direc;
$scope.$apply();
$scope.elements.splice(index, 1);
};
}

CSS
.left.ng-leave {
-webkit-transition:all linear 1s;
transition:all linear 1s;
}

.left.ng-leave.ng-leave-active{
-ms-transform: translateX(-100%);
-o-transform: translateX(-100%);
-moz-transform: translateX(-100%);
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
}

.left.ng-leave {
-ms-transform: translateX(0%);
-o-transform: translateX(0%);
-moz-transform: translateX(0%);
-webkit-transform: translateX(0%);
transform: translateX(0%);
}

.right.ng-leave {
-webkit-transition:all linear 1s;
transition:all linear 1s;
}

.right.ng-leave.ng-leave-active {
-ms-transform: translateX(100%);
-o-transform: translateX(100%);
-moz-transform: translateX(100%);
-webkit-transform: translateX(100%);
transform: translateX(100%);
}

.right.ng-leave {
-ms-transform: translateX(0%);
-o-transform: translateX(0%);
-moz-transform: translateX(0%);
-webkit-transform: translateX(0%);
transform: translateX(0%);
}

最佳答案

问题是,如果从 DOM 中删除重复元素,则它们没有任何 css 动画信息。我猜你已经注意到,如果你删除 $apply,元素会立即从 DOM 中删除。称呼。此外,您可能已经注意到,如果您对动画进行硬编码,动画会按预期发生,例如套装class="left"class="right" .

使ngAnimation如您所料 $animate服务浏览器需要您想要制作动画的信息。但这些信息是浏览器和$animate 知道的。仅在 DOM 操作发生时才提供服务。

如何解决此问题:您需要对 $scope.elements 进行更改在 DOM 上更新 css 类之后。因此,您需要延迟一个摘要循环的 DOM 操作。这可以通过 $timeout 来完成服务(有关更多信息,请参阅此答案 AngularJS : $evalAsync vs $timeout):

$scope.out = function(elem, direc, index) {
elem.anim = direc;
$timeout(function(){
$scope.elements.splice(index, 1);
});
};

关于angularjs - 在 ng-repeat 动画之前将 Angular ng-class 设置为 $apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com