Angular JS: временно отключить анимацию, предоставленную директивой, чтобы она не анимировалась при загрузке страницы?

В качестве названия см. эту скрипку:

http://jsfiddle.net/goodwill/ezNuj/

Который я добавил директиву со следующим кодом:

myApp.directive('ngFadeIn', function() {
  return function(scope, element, attr) {
    if (element.is('tr, tbody')) {
      element.find('td').effect("highlight", {}, 500);
    } else {
      element.effect("highlight", {}, 500);
    }
    return scope.destroy = function(complete) {
      return element.fadeOut(500, function() {
        if (complete) {
          return complete.apply(scope);
        }
      });
    };
  };
});

Проблема, с которой я сталкиваюсь, заключается в том, что при первой загрузке страницы, потому что я применил директиву в элементе ng-repeat, все элементы получили эффект подсветки (мигают один раз) при первой загрузке страницы. Как можно пропустить этот эффект без лишнего хака (в идеале все делается внутри директивы)


person William Yeung    schedule 22.02.2013    source источник


Ответы (4)


Интересно, я не уверен, что для этого есть простое и чистое решение. Кажется, что ngRepeatDirective построен так, чтобы не заботиться о том, работает ли повторитель в первый раз или просто добавляет новые элементы в список. И поэтому он не позволяет вам предпринимать разные действия в зависимости от этого. Директива ui-animate AngularUI, похоже, тоже не решает эту проблему, поэтому я не уверен, что это выполнимо прямо сейчас, не прибегая к надоедливым тайм-аутам.

Что вы можете сделать, так это изменить ngRepeatDirective, чтобы проверить что-то вроде атрибута ng-repeat-finished и выполнить его после завершения повторителя. Тогда должно быть тривиально добавить логику, чтобы избежать анимации на первом повторителе.

Кстати, вы не должны называть свои директивы префиксом ng, так как это то, что Angular использует внутри. Вы должны придумать собственный префикс для своего приложения.

person Anders Ekdahl    schedule 22.02.2013

Если бы мы могли определить, когда страница завершила рендеринг в первый раз, мы могли бы установить какое-то свойство службы или rootScope, которое может внедрить ваша директива, и, следовательно, проверить это свойство, чтобы определить, следует ли применять анимацию.

К сожалению, не существует способа определить, когда страница закончила рендеринг. См. AngularJS - Как запросить DOM, когда директива рендеринг завершен, что решает ту же проблему.

Единственный обходной путь, который я могу придумать, - это создать другую директиву (использовать ее один раз на странице), которая будет использовать $timeout для простой задержки примерно на 1 секунду, а затем сделать то, что я упомянул выше: установить какое-то свойство для службы или rootScope. Ваша директива fadeIn будет $смотреть это свойство/переменную, и когда значение изменится, она может установить какое-то локальное свойство/логическое значение/флаг, который разрешает или запрещает анимацию.

person Mark Rajcok    schedule 24.02.2013


У меня такая же проблема с использованием angular 1.4.9. Я не хочу, чтобы анимация ng-repeat происходила в первый раз. Единственный способ, который я нашел для этой работы, - это иметь пользовательскую директиву для родителя ng-repeat и отключить анимацию на короткое время:

(function (){
  'use strict';

  angular
    .module('directives')
    .directive('disableLoadingAnimation', disableLoadingAnimation);

  function disableLoadingAnimation($animate, $timeout) {
    var directive = {
      link: link,
      restrict: 'A'
    };
    return directive;

    function link(scope, element) {
      $animate.enabled(element, false);
      $timeout(function (){
        $animate.enabled(element, true);
      }, 1000);
    }
  }
})();

HTML

<table disable-loading-animation>
   <tr ng-repeat="line in lines">...</tr>
</table>

Мне не нравится тот факт, что я должен установить задержку в 1000 мс, но это более чистый способ, который я нашел до сих пор.

person mchasles    schedule 05.02.2016