https://github.com/angular/angular.js/issues/4818に関連
次のプランカーを参照してください: http ://plnkr.co/edit/i1DJ6ejtuHVFHty9jxfe?p = preview
要素<div class="box" ng-if="showBox">
は、永続的に循環する背景の5秒間の無限アニメーションがあります。 showBox
の値を切り替えると、要素のアニメーションが最初からやり直され、Enter / Leaveアニメーションが定義されていないにもかかわらず、5秒全体が経過するまでDOMから削除されません。
さらに問題があります。アニメーションが終了する前に値を複数回切り替えると(チェックボックスを数回クリックすると)、要素の複数のコピーが同時に表示されます。
問題は、ngAnimateが、使用されるすべてのアニメーションイベント(Enter、Leaveなど)に対して無限のアニメーションが存在すると見なすことです。 また、これは無限のアニメーションであるため、7.5秒後の最後のカウントダウンが経過するまでCSSイベントが発生することはありません(5 x 1.5 == 7.5)。
要素の.ng-animate
CSSクラスをオーバーライドし、キーフレームアニメーションをキャンセルして、無限の背景アニメーションをアニメーション化しないようにng-animateに指示する必要があります。
http://plnkr.co/edit/fq7ZEO7tDnqLmavHoBfQ?p=preview
.box.ng-animate {
-webkit-animation: none 0s;
animation: none 0s;
}
残念ながら、JavaScriptでのスタイルとCSSクラスの検出は非常に制限されています。 以前のバージョンのAngularJSでは、アニメーションプロパティ(.ng-enter、.ng-leaveなど)でのみCSSアニメーション/トランジションを定義できるというルールがありましたが、それによって解決されるよりも多くの問題が発生しました。 したがって、この場合は逆のことをする必要があります。
PS。 他のすべてのベンダーがプレフィックスを削除したため、必要なのは-webkit-
プレフィックスと標準のanimation
プロパティだけです。
かっこいい、回避策をありがとう。
一度に複数のコピーを作成することは、私にはまだバグのように思えます。 ng-if
を使用する要素が一度存在するか、まったく存在しないことを前提にコードを記述します。不注意によるnoobのミスによる簡単な破損を防ぐためのフレームワーク。 ng-if
(またはng-switch
)がどのように機能するのか誤解した場合は、訂正してください。
アニメーションがまだ続いていたので、複数のコピーがそこにありました。 また、$ animateには、期間* 1.5の期限が切れた後に発生するキーフレーム/トランジションのcatch-all
アニメーションがあります。 そのため、しばらくすると消えます。
ng-ifコードが正しい。 そして、はい、それは真実のときだけそこにあります。 ただし、内部では、式が再びtrueになるたびに、要素の新しいコピーが作成されます。 ただし、アニメーションは古い要素にぶら下がっているため、すべてのアニメーションをキャッチするまで、まだ削除されていません。
また、ng-switchとng-ifは同じように動作します。 ng-switchだけが1つではなく複数の要素を持っています。
最も参考になるコメント
問題は、ngAnimateが、使用されるすべてのアニメーションイベント(Enter、Leaveなど)に対して無限のアニメーションが存在すると見なすことです。 また、これは無限のアニメーションであるため、7.5秒後の最後のカウントダウンが経過するまでCSSイベントが発生することはありません(5 x 1.5 == 7.5)。
要素の
.ng-animate
CSSクラスをオーバーライドし、キーフレームアニメーションをキャンセルして、無限の背景アニメーションをアニメーション化しないようにng-animateに指示する必要があります。http://plnkr.co/edit/fq7ZEO7tDnqLmavHoBfQ?p=preview
残念ながら、JavaScriptでのスタイルとCSSクラスの検出は非常に制限されています。 以前のバージョンのAngularJSでは、アニメーションプロパティ(.ng-enter、.ng-leaveなど)でのみCSSアニメーション/トランジションを定義できるというルールがありましたが、それによって解決されるよりも多くの問題が発生しました。 したがって、この場合は逆のことをする必要があります。
PS。 他のすべてのベンダーがプレフィックスを削除したため、必要なのは
-webkit-
プレフィックスと標準のanimation
プロパティだけです。