2014-10-08 14 views
5

Ich versuche eine Animationssequenz zu erstellen, indem ich Aufrufe von addClass/removeClass kombiniere.Animationssequenz mit AngularJS addClass/removeClass

Nach Ende der Animationsmethode wird "removeClass" aufgerufen, um die Animation zu entfernen und eine neue zu starten. Aber aus irgendeinem Grund passiert nichts. Ich versuche herauszufinden, warum es nicht funktioniert? Warum wird die Klasse nicht entfernt?

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

Vollversion finden Sie hier

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

Antwort

4

Sie in diesem Hack aussehen kann ich in Ihrem Plunker gemacht: 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); 

      }); 
     }; 
    }; 
}]); 

Ich empfehle eine reine CSS-Lösung versucht, halte den Code klarer. Sie können einen Blick here zum Beispiel

+0

Dank für Sie Empfehlung, ich denke, es gute Praxis – linksta

+0

Es ist für mich ein gleiches Problem funktioniert wäre, eine Frage, warum hast du den Anruf innerhalb eines Timers gilt $? es funktioniert sicher, und wenn ich die $ ohne Timer anwenden alle Animationen bricht und nicht funktioniert, denke ich, der Aufruf von $ Digest verrückt wird, aber keine in den Timer .... warum: -O – Kalamarico

+1

Im Nachhinein sollten Sie Verwenden Sie stattdessen [$ timeout] (https://docs.angularjs.org/api/ng/service/$timeout). setTimeout geht außerhalb eckig (also Änderungen werden nicht von eckigen erkannt) und apply bringt es wieder zurück –

2

Hier ist eine weniger hackety Version von Richards Lösung (mit setClass anstelle eines 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

Sie meinen, dass Sie das Versprechen "then" verwenden und nicht "setTimeout". "setClass ist eine Funktion von $ angular, die Sie aufrufen, nachdem das" then "Versprechen erfüllt wurde. –