ng-repeat кастомный фильтр для фильтрации обьектов (непонятное поведение)
Доброго времени суток!
В руководстве написанно, что ng-repeat работает только с массивами. Часто возникает нужда в хешах и нужно их обходить с помощью ng-repeat и применить filter. Ниже приведенный пример работает, но не так как надо - игнорирует фильтр. <div ng-app="tmp"> <div ng-controller="Ctrl"> <ul ng-repeat="(key,value) in items | filter:{val:1}"> {{value.name}} </ul> </div> <div> angular.module('tmp',[]) .controller('Ctrl',['$scope', function(data) { data.items = { a:{name:'a1', val:1}, b:{name:'a2', val:2}, c:{name:'a3', val:1} } }]) Выход есть - это создать свой фильтр. Ниже приведенный пример(Фильтр) работает так, как надо. .filter('customFilter',function(){ return function (items, criterion) { console.log('Джина вызывали?') var tmp = {}; for(var i in items){ var item = items[i]; if(item.val == criterion.val){ tmp[i] = item; } } return tmp; } }) Теперь собственно вопрос: Почему сообщение "Джина вызывали?" в консоль выводится два раза? Вот фидл с примером http://jsfiddle.net/yMLt9/ |
Тут есть пример http://plnkr.co/edit/lRkvtMyIuscsvIIZn8CA?p=preview
|
Цитата:
Меня интересую всовсем другой вопрос (о поведении кастомного фильтра и наверное не только кастомного) и я его задал в конце своего поста. Почему сообщение "Джина вызывали?" в консоль выводится два раза? Вот фидл с примером http://jsfiddle.net/yMLt9/ |
Тоже интересен ответ, но такая история и с $scope.$watch
|
C $scope.$watch другая история. Просто у него могут быть срабатывания, когда старое и новое значение равны.
Здесь же надпись «Джина вызывали» появляется второй раз только если появился элемент, попадающий в выборку. Скорее всего, это сделано для того, чтобы к новому элементу применить следующие фильтры по цепочке. |
Цитата:
|
выполняется scan пока есть изменения (если больше 9 срабатываний: Uncaught Error: 10 $digest() iterations reached. Aborting!). При первом они есть, при втором их нет. Вот так есть при втором, третий scan срабатывает в холостую:
angular.module('tmp',[]) .controller('Ctrl',['$scope', function(data) { data.items = { a:{name:'a1', val:1}, b:{name:'a2', val:0}, c:{name:'a3', val:0} } }]).filter('customFilter',function(){ return function (items, criterion) { console.log('Джина вызывали?') var tmp = {}; for(var i in items){ var item = items[i]; if(item.val == criterion.val){ tmp[i] = item; } item.val++; } return tmp; } }) а так при третьем, четвертый - холостой: angular.module('tmp',[]) .controller('Ctrl',['$scope', function(data) { data.items = { a:{name:'a1', val:1}, b:{name:'a2', val:0}, c:{name:'a3', val:-1} } }]).filter('customFilter',function(){ return function (items, criterion) { console.log('Джина вызывали?') var tmp = {}; for(var i in items){ var item = items[i]; if(item.val == criterion.val){ tmp[i] = item; } item.val++; } return tmp; } }) |
Riim, и какое отношение это имеет к вопросу? ) (лишнее срабатывание)
|
Цитата:
|
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 15:53. |