Arrêter L'Animation angulaire sur ng-show / ng-hide
dans mon application AngularJS j'utilise fontawesome pour mes broches de chargement:
<i class="fa fa-spin fa-spinner" ng-show="loading"></i>
J'utilise aussi AngularToaster pour les messages de notification qui ont une dépendance sur ngAnimate. Quand j'inclue ngAnimate dans mon application AngularJS, ça gâche mes spinners de chargement en les animant d'une manière étrange. Je veux empêcher cela de se produire, mais je ne peux pas trouver un moyen de désactiver l'animation juste sur ces chargeurs (il serait également puant d'avoir à mettre à jour chaque chargeur j'ai dans mon application).
est un plunkr montrant mon problème exact.
5 réponses
je pense que la meilleure façon de le faire est d'utiliser le $animateProvider.classNameFilter
qui vous permettra de filtrer les éléments à animer ou dans ce cas de ne pas animer. Nous allons faire quelque chose comme:
$animateProvider.classNameFilter(/^((?!(fa-spinner)).)*$/);
//$animateProvider.classNameFilter(/^((?!(fa-spinner|class2|class3)).)*$/);
Démo:
http://plnkr.co/edit/lbqviQ87MQoZWeXplax1?p=preview
Angulaire docs de l'état:
définit et / ou renvoie la classe CSS regular expression qui est cochée lors de l'exécution d'une animation. Lors de l'amorçage, la valeur classNameFilter n'est pas définie et donc permettront $animer pour tenter de effectuer une animation sur n'importe quel élément. Lors de la mise en place du classNameFilter valeur, les animations ne seront effectuées que sur des éléments qui correspond à l'expression filter. Cela peut à son tour améliorer les performances faible puissance des appareils ainsi que des applications contenant beaucoup de les opérations structurelles.
comme autre réponse dans le commentaire de la directive no-animate
, vous pouvez écrire une directive ng-show
qui s'exécutera à une priorité plus élevée et désactivera l'animation. Nous ne le ferons que si l'élément a la classe fa-spinner
.
problemApp.directive('ngShow', function($compile, $animate) {
return {
priority: 1000,
link: function(scope, element, attrs) {
if (element.hasClass('fa-spinner')) {
// we could add no-animate and $compile per
// /q/angularjs-exclude-certain-elements-from-animations-46532/"http://plnkr.co/edit/BYrhEompZAF5RKxU7ifJ?p=preview" rel="noreferrer">http://plnkr.co/edit/BYrhEompZAF5RKxU7ifJ?p=preview
Lastly, and similar to the above, we can use the no-animate
directive if we want to make it a little more modular. In this case I'm naming the directive faSpin
which you could do in the answer above. This is essentially the same only we are preserving the directive from the SO answer mentioned in the comment of the above codeset. If you only care about the fa-spin
animation issues naming it this way works well, but if you have other ng-show
animation problems you'd want to name it ngShow
and add to the if clause.
problemApp.directive('noAnimate', ['$animate',
function($animate) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
$animate.enabled(false, element)
scope.$watch(function() {
$animate.enabled(false, element)
})
}
};
}
])
problemApp.directive('faSpin', function($compile, $animate) {
return {
priority: 1000,
link: function(scope, element, attrs) {
if (element.hasClass('fa-spinner')) {
element.attr('no-animate', true);
$compile(element)(scope);
}
}
}
});
j'ai eu un problème similaire où mon icône tournait jusqu'à ce que l'animation soit terminée, même après que la variable $scope soit désactivée. Ce qui a fonctionné pour moi était d'envelopper l'élément <i>
fa-icon dans une portée.
<span ng-if="loading"><i class="fa fa-refresh fa-spin"></i></span>
essayez!
j'ai trouvé un moyen plus facile.
<i class="fa fa-spinner" ng-show="loading" ng-class="{'fa-spin' : loading}"></i>
plongeur Fourché: http://plnkr.co/edit/mCsw5wBL1bsLYB7dCtQF
je suis tombé sur un autre petit problème à la suite de faire ceci où l'icône apparaîtrait hors de position si elle tournoyait pendant plus de 2 secondes, mais cela a été causé par la classe' ng-hide-add-active', donc j'ai juste ajouté dans mon css:
.fa-spinner.ng-hide-add-active {
display: none !important;
}
et c'est réglé.
EDIT: la solution de Nico est une version légèrement plus propre de celui-ci, donc je considérerais utiliser le sien.
angular.module('myCoolAppThatIsAwesomeAndGreat')
.config(function($animateProvider) {
// ignore animations for any element with class `ng-animate-disabled`
$animateProvider.classNameFilter(/^((?!(ng-animate-disabled)).)*$/);
});
alors vous pouvez juste ajouter la classe ng-animate-disabled
à n'importe quel élément que vous voulez.
<button><i class="fa fa-spinner ng-animate-disabled" ng-show="somethingTrue"></i></button>
Mise À Jour James Fiala Réponse .
<i class="fa fa-spinner fa-spin" ng-show="loading"></i>
Vous n'avez pas besoin de la ng-class
, comme mentionné dans @James Fiala Réponse. Mais vous devriez avoir fa-spin
comme un de la classe.
Ajouter du style
.fa-spinner.ng-hide-add-active {
display: none !important;
}