2014-10-08 12 views
5

Sto provando a creare una sequenza di animazione combinando le chiamate ad addClass/removeClass.Sequenza di animazione usando AngularJS addClass/removeClass

Al termine del metodo di animazione "removeClass" viene chiamato per rimuovere l'animazione e avviarne una nuova. Ma per qualche ragione, non succede niente. Sto cercando di capire perché non funziona? Perché la lezione non viene rimossa?

$animate.addClass(element, 'fadeInDown').then(function() { 
    $animate.removeClass(element, 'fadeInDown'); // why is it not working? 
    $animate.addClass(element, 'fadeOutDown'); 
}); 

versione completa può essere trovato qui

http://plnkr.co/edit/EFybfU4jcZoT3S7jCpM8?p=preview

risposta

4

Potete guardare questo hack che ho fatto nella tua plunker: http://plnkr.co/edit/iMMdPUrIz132PsCtB2Uq?p=preview

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

myApp.controller('Controller', function($scope) {}); 

myApp.directive('animated', ['$animate', '$window', function($animate, $window) { 
    return function(scope, element, attrs) { 
     scope.animate = function() { 
      $animate.addClass(element, 'fadeInDown').then(function() { 
       $animate.removeClass(element, 'fadeInDown'); // why is it not working? 

       setTimeout(function() { 
        scope.$apply(function() { 
         $animate.addClass(element, 'fadeOutDown'); 
        }); 
       }, 0); 

      }); 
     }; 
    }; 
}]); 

Vi consiglio di provare una soluzione CSS puro mantieni il codice più chiaro. Puoi dare un'occhiata a here per esempio

+0

grazie per voi raccomandazione, credo che sarebbe buona pratica – linksta

+0

Funziona per me per uno stesso problema, una domanda, perché hai messo il $ applicare chiamata all'interno di un timer? funziona di sicuro, e se faccio $ applicare senza timer tutte le animazioni si rompono e non funziona, penso che il richiamo di $ digest impazzisca, ma non all'interno del timer .... perché: -O – Kalamarico

+1

In retrospettiva dovresti utilizzare invece [$ timeout] (https://docs.angularjs.org/api/ng/service/$timeout). setTimeout va fuori angolare (quindi le modifiche non vengono rilevate da angolare) e applica lo riporta di nuovo in –

2

Ecco una versione meno pesante della soluzione di richard (usando setClass invece di un timeout).

http://plnkr.co/edit/lIfPq2acHUu9Va6gou05?p=preview

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

myApp.controller('Controller', function ($scope) { 
}); 

myApp.directive('animated', ['$animate', '$window', function ($animate, $window) { 
    return function (scope, element, attrs) { 
    scope.animate = function() { 
     $animate.addClass(element, 'fadeInDown') 
     .then(function() { 
      $animate.setClass(element, 'fadeOutDown', 'fadeInDown'); 
      scope.$digest(); 
     }); 
    }; 
    }; 
}]); 
+0

Vuoi dire che stai usando la promessa "allora", e non "setTimeout". "setClass è una funzione di $ angular che stai chiamando dopo che la promessa" allora "è stata soddisfatta. –

Problemi correlati