ngAnimate stopped working in AngularJS 1.6.4

2019-03-27 18:19发布

I've got a simple application with a simple css animation which works like a charm in AngularJS 1.2.2 + ngAnimate 1.2.2:

-> Runnable demo works like a charm.

For (maybe) no reason the same codes doesn't work with AngularJS 1.6.4 + ngAnimate 1.6.4:

-> Broken animation demo

The animation css classes were not added. There is no error in console. I can't figure out whats wrong here. Please note that $scope.pictures is dummy data.

View

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular-animate.min.js"></script>
        <link rel="stylesheet" href="./style.css">
        <script src="app.js"></script> 
        <title></title>
    </head>
    <body ng-app="portfolio">
        <div class="gallery" ng-controller="galleryController">
          <div class="appear" ng-repeat="picture in pictures"></div>
        </div>
    </body>
</html>

AngularJS Application

/*global angular, console*/
var app = angular.module('portfolio', ['ngAnimate']);
(function() {
  "use strict";
  /* Gallery Controller */
  app.controller('galleryController', function(
      $scope
    ) {
      $scope.pictures = [
          "http://www.d3d.sk/images/MK2_Granade_full.png",
          "http://www.d3d.sk/images/aberry-logo.jpg",
          "http://www.d3d.sk/images/logo-aberry.png",
          "http://www.d3d.sk/images/Crystal_balls.jpg",
          "http://www.d3d.sk/images/Purple_sun.jpg",
          "http://www.d3d.sk/images/planets.jpg",
          "http://www.d3d.sk/images/d3d.jpg",
          "http://www.d3d.sk/images/bpg-logo.png",
          "http://www.d3d.sk/images/Logo - Bukona.jpg",
          "http://www.d3d.sk/images/sky_up_fire.jpg",
          "http://www.d3d.sk/images/plexus.jpg",
          "http://www.d3d.sk/images/dch.jpg",
          "http://www.d3d.sk/images/Dimonsium-front-a.jpg",
          "http://www.d3d.sk/images/DWTS-3.jpg",
          "http://www.d3d.sk/images/Dwts-redesign-1.png",
          "http://www.d3d.sk/images/diplom.jpg",
          "http://www.d3d.sk/images/Genessis.jpg",
          "http://www.d3d.sk/images/Genessis - logo-final.jpg",
          "http://www.d3d.sk/images/Genessis - logo.jpg",
          "http://www.d3d.sk/images/Goholor.jpg",
          "http://www.d3d.sk/images/iron.jpg",
          "http://www.d3d.sk/images/bg_body3.jpg",
          "http://www.d3d.sk/images/bg_body4.jpg",
          "http://www.d3d.sk/images/lampa-2.png",
          "http://www.d3d.sk/images/MaxEnergy-design.jpg",
          "http://www.d3d.sk/images/North-first-2.jpg",
          "http://www.d3d.sk/images/North Side Dres - ver 1c.jpg",
          "http://www.d3d.sk/images/oznamko-16.jpg",
          "http://www.d3d.sk/images/oznamko-17.jpg",
          "http://www.d3d.sk/images/Verzia4e.jpg",
          "http://www.d3d.sk/images/Svk-dres.jpg",
          "http://www.d3d.sk/images/Rool-up04bc.jpg",
          "http://www.d3d.sk/images/Senica-letak-maly.jpg",
          "http://www.d3d.sk/images/Merkur - dizajn - 4.jpg",
          "http://www.d3d.sk/images/Trades-world-2.jpg",
          "http://www.d3d.sk/images/web-1.jpg",
          "http://www.d3d.sk/images/web-3.jpg",
          "http://www.d3d.sk/images/web-5.jpg",
          "http://www.d3d.sk/images/web-7.jpg",
          "http://www.d3d.sk/images/web-8.jpg",
          "http://www.d3d.sk/images/web-10.jpg",
          "http://www.d3d.sk/images/web-11.jpg",
          "http://www.d3d.sk/images/vizitka.jpg"
        ];
    });
}());

Styles

.appear.ng-enter {
    transition: 0.5s linear transform, 0.8s linear opacity;
    opacity: 0;
    transform: scale(0);
}

.appear.ng-enter.ng-enter-active {
    opacity: 1;
    transform: scale(1);
}

1条回答
贪生不怕死
2楼-- · 2019-03-27 19:08

I believe they changed the way the animation classes are added, now if an array is already initialised with data it won't set the class ng-enter, so the only way around this is to set your array to be empty and add a slight timeout.

/*global angular, console*/
var app = angular.module('portfolio', ['ngAnimate']);
(function() {
  "use strict";
  /* Gallery Controller */
  app.controller('galleryController', function(
    $scope,
    $timeout
  ) {
    $scope.pictures = [];

    $timeout(function() {
      $scope.pictures = [
        "http://www.d3d.sk/images/MK2_Granade_full.png",
        "http://www.d3d.sk/images/aberry-logo.jpg",
        "http://www.d3d.sk/images/logo-aberry.png",
        "http://www.d3d.sk/images/Crystal_balls.jpg",
        "http://www.d3d.sk/images/Purple_sun.jpg",
        "http://www.d3d.sk/images/planets.jpg",
        "http://www.d3d.sk/images/d3d.jpg",
        "http://www.d3d.sk/images/bpg-logo.png",
        "http://www.d3d.sk/images/Logo - Bukona.jpg",
        "http://www.d3d.sk/images/sky_up_fire.jpg",
        "http://www.d3d.sk/images/plexus.jpg",
        "http://www.d3d.sk/images/dch.jpg",
        "http://www.d3d.sk/images/Dimonsium-front-a.jpg",
        "http://www.d3d.sk/images/DWTS-3.jpg",
        "http://www.d3d.sk/images/Dwts-redesign-1.png",
        "http://www.d3d.sk/images/diplom.jpg",
        "http://www.d3d.sk/images/Genessis.jpg",
        "http://www.d3d.sk/images/Genessis - logo-final.jpg",
        "http://www.d3d.sk/images/Genessis - logo.jpg",
        "http://www.d3d.sk/images/Goholor.jpg",
        "http://www.d3d.sk/images/iron.jpg",
        "http://www.d3d.sk/images/bg_body3.jpg",
        "http://www.d3d.sk/images/bg_body4.jpg",
        "http://www.d3d.sk/images/lampa-2.png",
        "http://www.d3d.sk/images/MaxEnergy-design.jpg",
        "http://www.d3d.sk/images/North-first-2.jpg",
        "http://www.d3d.sk/images/North Side Dres - ver 1c.jpg",
        "http://www.d3d.sk/images/oznamko-16.jpg",
        "http://www.d3d.sk/images/oznamko-17.jpg",
        "http://www.d3d.sk/images/Verzia4e.jpg",
        "http://www.d3d.sk/images/Svk-dres.jpg",
        "http://www.d3d.sk/images/Rool-up04bc.jpg",
        "http://www.d3d.sk/images/Senica-letak-maly.jpg",
        "http://www.d3d.sk/images/Merkur - dizajn - 4.jpg",
        "http://www.d3d.sk/images/Trades-world-2.jpg",
        "http://www.d3d.sk/images/web-1.jpg",
        "http://www.d3d.sk/images/web-3.jpg",
        "http://www.d3d.sk/images/web-5.jpg",
        "http://www.d3d.sk/images/web-7.jpg",
        "http://www.d3d.sk/images/web-8.jpg",
        "http://www.d3d.sk/images/web-10.jpg",
        "http://www.d3d.sk/images/web-11.jpg",
        "http://www.d3d.sk/images/vizitka.jpg"
      ];
    })

  });
}());
/* gallery mosaic - grid */

.gallery {
  -webkit-column-count: 3;
  /* Chrome, Safari, Opera */
  -moz-column-count: 3;
  /* Firefox */
  column-count: 3;
}

.gallery img {
  width: 100%;
  padding: 7px 0;
}

.appear {
  height: 150px;
  width: 150px;
  margin: 5px;
  background-color: red;
}


/* gallery mosaic - animate appearance  */

.appear.ng-enter {
  transition: 0.5s linear transform, 0.8s linear opacity;
  opacity: 0;
  transform: scale(0);
}

.appear.ng-enter.ng-enter-active {
  opacity: 1;
  transform: scale(1);
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular-animate.min.js"></script>

<body ng-app="portfolio">
  <div class="gallery" ng-controller="galleryController">
    <div class="appear" ng-repeat="picture in pictures"></div>
  </div>
</body>

Obviously, you can change this timeout to a time that what works for you.

查看更多
登录 后发表回答