2014-10-08 9 views
5

Próbuję utworzyć sekwencję animacji, łącząc wywołania metody addClass/removeClass.Sekwencja animacji przy użyciu metody AngularJS addClass/removeClass

Po zakończeniu metody animacji wywoływana jest metoda "removeClass" w celu usunięcia animacji i uruchomienia nowej. Ale z jakiegoś powodu nic się nie dzieje. Próbuję dowiedzieć się, dlaczego to nie działa? Dlaczego klasa nie została usunięta?

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

Pełna wersja można znaleźć tutaj

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

Odpowiedz

4

Można spojrzeć na ten siekać zrobiłem w swoim 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); 

      }); 
     }; 
    }; 
}]); 

Polecam spróbować czystego rozwiązanie css utrzymuj kod jaśniejszy. Możesz spojrzeć na here na przykład

+0

dzięki rekomendacji dla Ciebie, myślę, że to byłoby dobre praktyki – linksta

+0

To działa na mnie przez samego problemu, jedno pytanie, dlaczego umieścić $ zastosować połączenia wewnątrz zegarem? to działa na pewno, a jeśli zrobię $ apply without timer wszystkie animacje zrywają się i nie działają, myślę, że wezwanie $ digest szaleje, ale nie ma w środku timera .... dlaczego: -O – Kalamarico

+1

Z perspektywy czasu powinieneś zamiast tego użyj [$ timeout] (https://docs.angularjs.org/api/ng/service/$timeout). setTimeout wychodzi poza granice (więc zmiany nie są wykrywane przez kątowe) i stosuje ponownie je przywraca –

2

Oto mniej hackety wersja rozwiązania Richarda (przy użyciu setClass zamiast 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

Masz na myśli, że używasz obietnicy "wtedy", a nie "setTimeout". "setClass jest funkcją kątową, do której dzwonisz po spełnieniu obietnicy" wtedy ". –

Powiązane problemy