остановка анимации в angularjs при фильтрации ng-repeat

#javascript #html #angularjs #ng-animate

#javascript #HTML #angularjs #ng-анимировать

Вопрос:

У меня есть веб-приложение angular, когда оно загружает список «Заметок» в вызываемый массив областей notes .

Этот список фильтруется примерно ng-repeat так:

 <div class="noteClass" ng-repeat="n in notes | propertyFilter: 'Fields.noteTabNumber' : selectedTab">
  

Все это работает нормально, и я добавил несколько CSS-анимаций в свой CSS-файл, чтобы при добавлении нового элемента в notes массив он анимировался в сцене.

 div.noteClass.ng-enter,
div.noteClass.ng-leave,
div.noteClass.ng-move {
    //my animations here
}

div.noteClass.ng-enter,
div.noteClass.ng-move
 {
    //my further animation functions
}

div.noteClass.ng-enter.ng-enter-active,
div.noteClass.ng-move.ng-move-active {
    /// finished animations
}
  

Моя проблема связана с фильтром, как вы можете видеть, список фильтруется с помощью настраиваемого фильтра, propertyFitler который фильтрует заметки, основываясь на том, какую вкладку выбрал пользователь.

Что является простым UL :

 <ul>
    <li ng-class="{selected: selectedTab==1}">...</li>
    <li ng-class="{selected: selectedTab==2}">...</li>
    <li ng-class="{selected: selectedTab==3}">...</li>
</ul>
  

Когда пользователь нажимает на другую вкладку, анимация для элементов срабатывает, а не просто мгновенно фильтрует список.

Как я могу анимировать новый элемент в списке, но когда пользователь фильтрует список по LI элементу, не анимируйте изменения в списке?

Ответ №1:

Вы можете внедрить $animate службу в свой контроллер, тогда сначала должен быть вызван любой обратный вызов, который у вас есть для нажатия на вкладку $animate.enabled(false) . Это отключит анимацию. Затем просто вызовите $animate.enabled(true) , как только страница обновится. Знание того, когда снова включить анимацию, может быть сложной частью. Проще всего просто $timeout отключить анимацию на полсекунды или около того. Если вам это не нравится, есть несколько сообщений в блоге о разработке when ngRepeat завершает свою работу. Или, возможно, есть действительно очевидное и чистое решение, которое я не рассматривал.

Комментарии:

1. итак, как бы я это использовал? Нужно ли мне устанавливать noAnimate = true , когда пользователь нажимает на элемент списка, а затем изменять selectedTab свойство? Я не слишком хорошо знаком с сервисными декораторами…

2. Хорошо, отмените мой последний. Новый ответ намного проще.

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