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, время: 01:39. |