Фильтр AngularJS запускает бесконечный цикл $digest

Я хочу использовать выражение фильтра, такое как values | filter:value1, чтобы скрыть или показать div, где values и value объявлены в области видимости в функции ссылки директивы.

Это работает, как и ожидалось, за исключением того, что он продолжает запускать бесконечные ошибки цикла дайджеста.

Посмотрите этот jsbin для демонстрации: http://jsbin.com/nujineci/2/edit

Что я делаю не так? Почему эти ошибки должны возникать, когда фильтр не обновляет никакие модели?


person Nat    schedule 25.03.2014    source источник


Ответы (2)


Возможно, из-за использования filter внутри ng-show фильтр запускается в каждом цикле дайджеста и продолжает проверять, изменилось ли ваше значение или нет, если значение изменено, оно снова оценивает и дает новый результат, в противном случае он ничего не делает (потому что angularJs использует метод «грязной проверки», чтобы найти любые изменения)

http://jsbin.com/nujineci/4/edit

проверьте эту ссылку, я изменил

ng-show="g.values | filter:g.value1"

To

ng-show="g.values.indexOf(g.value1) != -1"

или ng-show="g.values.indexOf(g.value1) > -1" // это то же самое, что и выше

indexOf возвращает индекс элемента, если он существует в массиве, иначе возвращает -1

Я использую этот тип синтаксиса, никогда не было проблем с этим

person Vamsi    schedule 25.03.2014

Ответ на проблему находится в описании ошибки, которое предоставляет Angular.

Одной из распространенных ошибок является привязка к функции, которая генерирует новый массив при каждом вызове.

Это в основном то, что делает фильтр, каждый раз, когда он возвращает новый массив:

// some more code
var filtered = [];
for ( var j = 0; j < array.length; j++) {
  var value = array[j];
  if (predicates.check(value)) {
    filtered.push(value);
  }
}
return filtered;

Когда цикл дайджеста Angular запускается в первый раз, он получает массив, содержащий «bar» и пустой массив. Затем Angular снова запустит цикл дайджеста, чтобы проверить стабильность модели. Он получит новые массивы (экземпляры) и будет думать, что модель изменилась. Это вызовет еще один цикл дайджеста и так далее.

Вы должны проверить, содержит ли ваш массив значения и ng-show на этом. Например. Определить, содержит ли массив значение

Посмотрите на этот модифицированный jsbin: http://jsbin.com/nujineci/5/edit.

person lpiepiora    schedule 25.03.2014