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.

http://plnkr.co/edit/wVY5iSpUST52noIA2h5a

44
demandé sur Chris Lees 2014-07-07 22:55:49

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);

        }
      }
    }
  });

Démo: http://plnkr.co/edit/P3R74mUR27QUyxMFcyf4?p=preview

59
répondu lucuma 2014-07-08 14:24:18

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!

37
répondu internet-nico 2015-10-27 04:07:43

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.

17
répondu James Fiala 2017-04-17 16:18:38
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>

3
répondu ilovett 2015-10-17 00:07:25

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;
}
0
répondu Fizer Khan 2017-05-23 11:47:29