2014-10-08 3 views
5

Я пытаюсь сделать последовательность анимации, объединив вызовы addClass/removeClass.Последовательность анимации с использованием AngularJS addClass/removeClass

После завершения метода анимации «removeClass» вызывается для удаления анимации и запуска нового. Но почему-то ничего не происходит. Я пытаюсь понять, почему это не работает? Почему класс не удаляется?

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

Полная версия может быть найдена здесь

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

ответ

4

Вы можете посмотреть на этот хак я сделал в своей 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); 

      }); 
     }; 
    }; 
}]); 

Я рекомендую попробовать чистый раствор CSS для сохраните код более четким. Вы можете посмотреть here например

+0

спасибо для вас рекомендации, я думаю, что это будет хорошая практика – linksta

+0

Это работает для меня такая же проблема, один вопрос, почему ставишь $ применить вызов внутри таймера? он работает наверняка, и если я делаю $ apply без таймера, все анимации ломаются и не работают, я думаю, что вызов $ digest сходит с ума, но нет внутри таймера .... почему: -O – Kalamarico

+1

В ретроспективе вы должны используйте [$ timeout] (https://docs.angularjs.org/api/ng/service/$timeout). setTimeout выходит за пределы углового (так что изменения не обнаружены угловыми), и применение снова возвращает его –

2

Ниже представлена ​​версия решения Richard с использованием hackety (с использованием setClass вместо таймаута).

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

Вы имеете в виду, что вы используете обещание «then», а не «setTimeout». «setClass - это функция« углового », которую вы вызываете после выполнения« затем »обещания. –