Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.07.2013, 01:51
Новичок на форуме
Отправить личное сообщение для VerDiz Посмотреть профиль Найти все сообщения от VerDiz
 
Регистрация: 24.07.2013
Сообщений: 9

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/
Ответить с цитированием
  #2 (permalink)  
Старый 30.07.2013, 08:46
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Тут есть пример http://plnkr.co/edit/lRkvtMyIuscsvIIZn8CA?p=preview
Ответить с цитированием
  #3 (permalink)  
Старый 30.07.2013, 09:03
Новичок на форуме
Отправить личное сообщение для VerDiz Посмотреть профиль Найти все сообщения от VerDiz
 
Регистрация: 24.07.2013
Сообщений: 9

Сообщение от Shitbox2 Посмотреть сообщение
Тут есть пример http://plnkr.co/edit/lRkvtMyIuscsvIIZn8CA?p=preview
Я конечно извиняюсь, но я в вопросе и так показал, как филтр работает.
Меня интересую всовсем другой вопрос (о поведении кастомного фильтра и наверное не только кастомного) и я его задал в конце своего поста.

Почему сообщение "Джина вызывали?" в консоль выводится два раза?
Вот фидл с примером http://jsfiddle.net/yMLt9/
Ответить с цитированием
  #4 (permalink)  
Старый 30.07.2013, 12:07
Интересующийся
Отправить личное сообщение для xAockd Посмотреть профиль Найти все сообщения от xAockd
 
Регистрация: 25.07.2013
Сообщений: 12

Тоже интересен ответ, но такая история и с $scope.$watch
Ответить с цитированием
  #5 (permalink)  
Старый 31.07.2013, 12:02
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

C $scope.$watch другая история. Просто у него могут быть срабатывания, когда старое и новое значение равны.

Здесь же надпись «Джина вызывали» появляется второй раз только если появился элемент, попадающий в выборку. Скорее всего, это сделано для того, чтобы к новому элементу применить следующие фильтры по цепочке.
Ответить с цитированием
  #6 (permalink)  
Старый 31.07.2013, 15:12
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от VerDiz
Почему сообщение "Джина вызывали?" в консоль выводится два раза?
предлагаю задать этот вопрос разработчикам ангуляра и сообщить нам о результатах расследования
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 01.08.2013, 05:46
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

выполняется 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, 01.08.2013 в 05:52.
Ответить с цитированием
  #8 (permalink)  
Старый 01.08.2013, 17:26
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Riim, и какое отношение это имеет к вопросу? ) (лишнее срабатывание)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #9 (permalink)  
Старый 02.08.2013, 05:50
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от nerv_
и какое отношение это имеет к вопросу? ) (лишнее срабатывание)
я вроде как раз и объяснил почему оно происходит. Если что не понятно, спрашивай.
Ответить с цитированием
  #10 (permalink)  
Старый 03.08.2013, 23:40
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Riim
я вроде как раз и объяснил почему оно происходит. Если что не понятно, спрашивай.
т.е. аргумент на холостое срабатывание выглядит как
Сообщение от Riim
выполняется scan пока есть изменения
?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00