angualrのanimationは高速でクリックを繰り返したりすると、時々ng-animateクラスが削除され切らずにのこってしまい、表示がおかしくなる問題がある。
そこでアニメーションの終了を検知して、完了後自動でng-animateクラスを削除するように設定したらanimationの挙動を修正することが出来たのでメモ。
まずはanimation終了を検知するディレクティグを定義。
coreDirectives.directive('exShow', function($animate) { return { scope: { 'exShow': '=', 'afterShow': '&', 'afterHide': '&' }, link: function(scope, element) { scope.$watch('exShow', function(show, oldShow) { if (show) { $animate.removeClass(element, 'ng-hide', scope.afterShow); } if (!show) { $animate.addClass(element, 'ng-hide', scope.afterHide); } }); } } });
次にビュー側で用意したトリガーに関数をバインドする。
<div class="top-search-section" ex-show="sarchSection" after-hide="doneAnimate('top-search-section')"></div>
として、コントローラーでこうする。
$scope.toggleSearchSection = function() { $scope.sarchSection = $scope.sarchSection ? false : true; } $scope.doneAnimate = function(className) { $('.' + className).removeClass('ng-animate') }
アニメーション終了後、doneAnimateが動作して、指定された要素の「ng-animate」クラスが削除されるという流れ。