J'ai une liste sur laquelle j'itère en utilisant ng-repeat: et l'utilisateur peut interagir avec les éléments de la liste en utilisant les icônes de flèche vers le haut et vers le bas et en cliquant dessus, je change simplement l'ordre de l'élément dans la "liste" "c'est ce que angular suggère de changer le modèle et les changements se reflètent automatiquement dans la vue.
<div ng-repeat="item in list">
{{item.name}}
<div class="icon-up-arrow" ng-click="moveUp($index);"></div>
<div class="icon-down-arrow" ng-click="moveDown($index);"></div>
</div>
Logique dans moveUp: -
$scope.moveUp= function(position){
var temp=list[position-1];
list[position-1]=list[position];
list[position=temp];
};
le code ci-dessus fonctionne parfaitement et la logique de déplacement de l'élément vers le bas est similaire. Mais le problème que je veux résoudre est de savoir comment mettre une animation? Je sais angular s'occupe de la liaison de la vue et du modèle par lui-même, mais existe-t-il un moyen de mettre en animation lorsque la vue est mise à jour en appuyant sur les icônes de flèche vers le bas?
Suite au commentaire de Marcel: dans AngularJS 1.2, vous n'avez pas besoin d'utiliser le ng-animate
directive. Au lieu:
angular-animate[-min].js
.ngAnimate
..ng-enter
et .ng-enter-active
.ng-repeat
comme vous le feriez normalement.HTML:
<div ng-app="foo">
<!-- Set up controllers etc, and then: -->
<ul>
<li ng-repeat="item in items">{{item}}</li>
</ul>
JavaScript:
angular.module('foo', ['ngAnimate']);
// controllers not shown
CSS:
li {
opacity: 1;
}
li.ng-enter {
-webkit-transition: 1s;
transition: 1s;
opacity: 0;
}
li.ng-enter-active {
opacity: 1;
}
Démo dans (quelqu'un d'autre) Plunker .
Voir docs for $ animate pour plus de détails sur la progression à travers les différentes classes CSS.
Vérifiez ce lien http://www.nganimate.org/
Vous devez déclarer l'attribut ng-animate à un élément qui a une autre directive qui change le DOM
div ng-repeat="item in itens" ng-animate="{enter: 'animate-enter', leave: 'animate-leave'}"
Vous devez ajouter des transitions ou des animations CSS.
.animate-enter {
-webkit-transition: 1s linear all; /* Chrome */
transition: 1s linear all;
opacity: 0;
}
.animate-enter.animate-enter-active {
opacity: 1;
}
Vous pouvez vérifier l'exemple de plnkr ici: http://plnkr.co/edit/VfWsyg9d7xROoiW9HHRM
En complément de la dernière réponse, il existe la classe ng-move pour les animations lorsque l'ordre est modifié:
li {
opacity: 1;
}
li.ng-move {
-webkit-transition: 1s;
transition: 1s;
opacity: 0;
}
li.ng-move-active {
opacity: 1;
}
Dernier documentation ici .
Si vous ne souhaitez pas utiliser le module "ngAnimate" en raison de la réduction du nombre de plugins, vous pouvez archiver l'effet de transition simple en utilisant ng-init et des directives personnalisées.
<li ng-repeat="item in items" class="item" item-init>{{item.name}}</li>
.item{
opacity:0;
-webkit-transition: all linear 300ms;
transition: all linear 300ms;
}
.item.visible{
opacity:1;
}
myApp.directive('itemInit', function ($compile) {
return function (scope, element, attrs) {
scope.initItem(element);
};
});
En toi contrôleur
$scope.initItem = function(el){
$timeout(function(){
angular.element(el).addClass('visible');
},0);
}