глючная анимация на ng-repeat (анимирует неправильный элемент)

0

Я добавил анимацию для удаления элемента для элемента ng-repeat а затем он дублирует последний элемент списка и применяет анимацию на нем вместо удаленной.

Почему анимация не применяется к удаленному элементу, но вместо этого на последнем дублируется?

Полный пример кода: https://jsfiddle.net/8bhyv1b4/

Контроллер:

$scope.selectedImgs = [];

$scope.deleteImg = function() {
  $scope.selectedImgs.forEach(function(selectedImgIndex, i) {
    // remove image by index 
    $scope.imgs.splice(selectedImgIndex - i, 1);
  });
  $scope.selectedImgs = [];
}

$scope.toggleImg = function(index) {
  var i = $scope.selectedImgs.indexOf(index);
  if (i + 1) {
    $scope.selectedImgs.splice(i, 1);
  } else {
    $scope.selectedImgs.push(index);
    $scope.selectedImgs.sort(function sortNumber(a, b) {
      return a - b;
    });
  }
  $scope.$apply();
}

Шаблон:

<section class="txtcent">
  <img-row class="blk clearfix" size="imgs.length" ontoggle="toggleImg" selected="selectedImgs">
    <section ng-repeat="url in imgs track by $index" class="inlblk frameimg">
      <div>
        <img width="150" ng-src="{{url}}" />
      </div>
    </section>
  </img-row>
  <span class="noimgmsg" ng-if="!imgs.length">Add images</span>
</section>

CSS:

.frameimg.ng-leave{
  -webkit-animation: 3s removeImgItem;
}
@-webkit-keyframes removeImgItem {
  0% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}

Цените свою помощь

  • 0
    Так в чем именно твоя проблема? Я не вижу никаких вопросов там.
  • 0
    @Aides Почему анимация не применяется к удаленному элементу, а копирует последний элемент и анимирует его?
Показать ещё 3 комментария
Теги:
animation
angularjs-ng-repeat
ng-animate

2 ответа

2
Лучший ответ

Проблема вызвана track by $index и является относительно старой новостью.

Вы можете отслеживать его здесь

  • 0
    Спасибо, та же проблема и исправлена из-за отслеживания по $ index
0

используйте угловые обещания. ваш объект $ defer должен быть решен после завершения анимации; затем удалите свой элемент из массива, который отображает ng-repeat.

Сумма: сначала сделайте анимацию THEN (пообещайте решить) удалите свой элемент.

Здесь у вас есть $ q (отложенный) объект docs: https://docs.angularjs.org/api/ng/service/ $ q

promiseOfFinishedAnimation.then(function() {
  deleteElementFromArrayThatNGRepeatDisplays();
});

Ваша проблема устранена путем удаления элемента перед выполнением анимации. Вы выполняете анимацию на элементе массива, который не существует.

  • 0
    Обещания не легко понять с первой попытки, но я надеюсь, что вы пытаетесь решить эту проблему с обещаниями - они будут очень полезны для вас в будущем

Ещё вопросы

Сообщество Overcoder
Наверх
Меню