Обнаружение завершения пользовательского фильтра в AngularJS

У меня есть настраиваемая функция фильтра, которую я вызываю для директивы ng-repeat:

<div ng-repeat="app in appVm.appList | filter:appVm.assetFilter">{{app.title}}</div>

Очевидно, это затрагивает мою функцию assetsFilter для каждого приложения в списке приложений. Когда фильтрация завершена, я хочу запустить другую функцию.

Как я могу определить, когда проход фильтрации завершен?

Обновить

Основываясь на ответах, указывающих мне на другие ответы, я могу немного пояснить.

Когда я реализую это решение с помощью пользовательской директивы и использования области действия. $last, я наблюдаю следующее:

  • Он работает так, как ожидалось, когда страница отображается впервые и список заполняется — обнаруживается последний элемент.
  • Когда моя функция фильтра срабатывает и элементы удаляются из списка, обработчик директив вообще не срабатывает.
  • Когда те же элементы добавляются обратно в список, но они не являются последними элементами в списке, директива срабатывает, но только для элементов, добавляемых обратно, и нет элемента с областью действия. $last истинного.

Надеюсь, это поможет прояснить.


person LJW    schedule 28.11.2013    source источник
comment
Я не думаю, что это - см. обновление.   -  person LJW    schedule 28.11.2013
comment
Привет, я застрял в той же проблеме, мне нужно вызвать $scope.$broadcast('masonry.reload'); после окончания фильтра. Вы нашли способ сделать это? заранее спасибо   -  person teone    schedule 16.04.2014
comment
Это было бы намного проще, если бы $filter просто возвращал объект обещания. Тогда вы могли бы просто сделать... startLoader(); $filter('filterName')(filterValue).then(function() { endLoader(); });   -  person Gaui    schedule 14.05.2015


Ответы (1)


ng-repeat создает область для каждого повторяющегося элемента. Эта область включает $first и $last, так что вы можете добавить директиву, которая проверяет эти

HTML

<div ng-repeat="item in items"  check-last>

Директива:

app.directive('checkLast',function(){
  return{
    restrict:'A',
    link:function(scope,elem,attrs){
      if(scope.$last){
            /* repeater done code*/
      }
  }
  } 
})

ДЕМО

person charlietfl    schedule 28.11.2013
comment
Спасибо, но посмотрите обновление вопроса, объясняющее, почему это не работает. - person LJW; 28.11.2013
comment
ну, в первую очередь, это касается создания правильных вопросов в SO. Вы должны были указать это в своем вопросе для начала. Вопросы должны включать то, что вы пробовали, и проблемы, с которыми столкнулись. Создать демо - person charlietfl; 28.11.2013
comment
также какова цель запуска кода. Возможно, придется транслировать событие из фильтра - person charlietfl; 28.11.2013
comment
Я обнаружил это только после запуска ваших и других образцов. Цель кода — запустить некоторые визуальные анимации jquery в контейнере списка после завершения фильтрации. - person LJW; 28.11.2013
comment
вы не можете использовать ng-animate или ng-class? Также у меня есть еще одна идея....создать демо с фильтром на основе моего демо - person charlietfl; 28.11.2013