Часы AngularJS $ не работают для фильтрованного повторения ng

0

Я пытаюсь использовать $ watch на отфильтрованном списке данных, но он не работает. Вот фрагмент моего кода.

HTML:

<div ng-repeat="dlr in dealers | filter : filterDealers ">
    {{dlr.name}}
</div>

контроллер

$scope.$watch('dealers', function () {
    console.log('dealers was changed');
});

$scope.filterDealers = function (dlr) {
    if (dlr.name = 'test') {
        return true;
    } else {
        return false;
    }
}

Консоль.log печатается при загрузке страницы, но если я фильтрую список, он не печатается.

  • 2
    Какая польза от часов? Если у вас есть переменная $ scope, у вас уже есть 2-х сторонняя привязка.
  • 0
    Мне нужно запустить функцию после завершения фильтрации.
Показать ещё 3 комментария
Теги:

2 ответа

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

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

 <div ng-repeat="dlr in filteredDealers ng-init=filterDealers>"> 
     {{dlr.name}}
 </div>

И в вашем контроллере выполните:

$scope.filterDealer = function() {
    $scope.filteredDealers = [];
    for (var i=0; i<dealers.length; i++) {
        var dlr = dealers[i];
        if (dlr.name = 'test') {
            $scope.filteredDealers.push(dlr);
        }
    }
    // you know your filtering is done
    console.log('dealers was changed');
}
  • 0
    При этом я получаю следующую ошибку: Ошибка: [$ rootScope: infdig] 10 $ digest () достигнуты итерации. Aborting!
  • 0
    да - вы действительно не хотите смотреть что-то с двухсторонним связыванием @ user1024941, вы можете выполнить неприятную рекурсию. Если ваша проблема заключается в желании запустить функцию после выполнения фильтрации, вы можете рассмотреть другой подход.
0

Я не думаю, что вы захотите установить $watch на переменную $ scope с 2-мя границами. Если вы хотите, чтобы функция запускалась, когда ваш ng-repeat завершен, вы можете сделать небольшую директиву и проверить $last

Что-то вроде этого:

.directive('isLastItem', function () {
 return {
    restrict: 'A',
    link: function (scope, element, attr) {
        if (scope.$last === true) {
            //run your logic here
        }
    }
 }

затем html

<div ng-repeat="dlr in dealers | filter : filterDealers " is-last-item>

Теперь - я не знаю, где вы хотите, чтобы эта логика произошла, поэтому вы можете хотеть, чтобы $emit от вашей директивы к вашему контроллеру.

Ещё вопросы

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