2014-10-08 6 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에서 만들어진이 해킹 볼 수 있습니다 : I가 순수 CSS의 솔루션을 시도하는 것이 좋습니다 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); 

      }); 
     }; 
    }; 
}]); 

코드를 명확하게 유지하십시오. 당신이 볼 수 있습니다 here 예를 들어

+0

덕분에, 나는 그것이 그것은 같은 문제에 대해 나를 위해 작동 것이 좋습니다 – linksta

+0

있을 거라고 생각, 하나 개의 질문, 왜 당신은 $이 타이머 내부에 전화를 적용 있었습니까? 그것은 확실히 작동합니다. 타이머없이 $ 적용을하면 모든 애니메이션이 중단되고 작동하지 않습니다. $ digest의 호출은 미친 듯이 보이지만 타이머 내부에는 아무 것도없는 것 같아요. 왜 : -O – Kalamarico

+1

회상에서 대신 [$ timeout] (https://docs.angularjs.org/api/ng/service/$timeout)을 사용하십시오. setTimeout가 각도를 벗어나서 (변경 사항이 각도로 감지되지 않음) 적용한 후 다시 적용합니다. –

2

리차드의 솔루션은 덜 익숙한 버전입니다 (타임 아웃 대신 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

"setTimeout"이 아니라 "then"약속을 사용하고 있다는 것을 의미합니다. "setClass는"then "약속이 성취 된 후에 호출하는 $ angular의 함수입니다. –