2014-10-08 14 views
5

Tôi đang cố gắng tạo chuỗi hoạt ảnh bằng cách kết hợp các cuộc gọi đến addClass/removeClass.Trình tự hoạt ảnh bằng AngularJS addClass/removeClass

Sau cuối của phương pháp hoạt hình "removeClass" được gọi là để loại bỏ các hình ảnh động và bắt đầu một cái mới. Nhưng vì lý do nào đó, không có gì xảy ra cả. Tôi đang cố gắng tìm ra lý do tại sao nó không hoạt động? Tại sao lớp học không bị loại bỏ?

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

Phiên bản đầy đủ có thể được tìm thấy ở đây

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

Trả lời

4

Bạn có thể nhìn vào hack này tôi đã thực hiện trong plunker của bạn: 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); 

      }); 
     }; 
    }; 
}]); 

tôi khuyên bạn nên thử một giải pháp css tinh khiết để giữ mã rõ ràng hơn. Bạn có thể xem here ví dụ:

+0

nhờ bạn giới thiệu, tôi nghĩ rằng nó sẽ là tốt thực hành – linksta

+0

Nó làm việc cho tôi cho một vấn đề tương tự, một câu hỏi, tại sao bạn đặt $ áp dụng cuộc gọi trong một giờ? nó hoạt động chắc chắn, và nếu tôi làm $ áp dụng mà không có hẹn giờ tất cả các hình ảnh động phá vỡ và không hoạt động, tôi nghĩ rằng các cuộc gọi của $ tiêu hóa đi điên, nhưng không có bên trong bộ đếm thời gian .... tại sao: -O – Kalamarico

+1

Nhìn lại bạn nên sử dụng [$ timeout] (https://docs.angularjs.org/api/ng/service/$timeout) để thay thế. setTimeout đi bên ngoài góc cạnh (do đó thay đổi không được phát hiện bởi góc) và áp dụng đưa nó trở lại một lần nữa –

2

Đây là phiên bản ít rắc rối hơn của giải pháp richard (sử dụng setClass thay vì hết thời gian chờ).

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

Bạn có nghĩa là bạn đang sử dụng lời hứa "sau đó" chứ không phải "setTimeout". "setClass là hàm của $ angular mà bạn đang gọi sau khi lời hứa" sau đó "được thực hiện. –

Các vấn đề liên quan