Я пытаюсь использовать $ 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 печатается при загрузке страницы, но если я фильтрую список, он не печатается.
Если вам нужно только знать, когда данные фильтруются, просто отфильтруйте дилеров в вашем контроллере.
<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');
}
Я не думаю, что вы захотите установить $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
от вашей директивы к вашему контроллеру.