Задать вопрос
@summer_rain

AngularJS. Как отловить событие завершения работы директивы «ng-repeat» при сортировке или фильтрации?

Всем привет!

Имею следующий код

<tr ng-repeat="row in $ctrl.rows | filter:$ctrl.filterBy | orderBy : $ctrl.order.by : $ctrl.order.reverse as results track by row.id"
      ng-init="$ctrl.afterRepeat = results.length"
  >


Через watcher в классе-контроллере отлавливаю событие изменения переменной "$ctrl.afterRepeat", которое происходит по завершении "ng-repeat"-цикла. Да, это извращение, я знаю. :) А так же знаю и пробовал другой, менее извращенный вариант через
....
  ng-init="$last && $ctrl.onRepeatEnd()"
....


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

В общем, как надежно отлавливать событие изменения на ng-repeat?
  • Вопрос задан
  • 249 просмотров
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
@lega
Из ng-repeat можно получать результирующий массив который рендерится, можете попробовать его отслеживать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Stepanya
Зачем фильтровать в шаблоне? Отсортируйте массив в js и отдайте уже отсортированный массив

function ctrl() {
 var vm = this;
 var array = [2,1,3];
 vm.filteredRows= null;

  function doFilter(array) {
   //фильтруем...
   return filtered;
  }

vm.$onInit = function () {
  vm.filteredRows= doFilter(array);
}


<tr ng-repeat="row in $ctrl.filteredRows></tr>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы