AngularJS过滤器触发无限$ digest循环

时间:2014-03-25 14:48:17

标签: angularjs angularjs-directive angularjs-filter

我想使用像values | filter:value1这样的过滤器表达式来隐藏或显示div,其中valuesvalue都在包含指令的链接中的范围内声明功能

这可以正常工作,除了它不断触发无限的摘要循环错误。

请参阅此jsbin进行演示:http://jsbin.com/nujineci/2/edit

我做错了什么?当过滤器没有更新模型时,为什么会出现这些错误?

2 个答案:

答案 0 :(得分:16)

问题的答案在于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。例如。 Determine whether an array contains a value

查看此修改后的jsbin:http://jsbin.com/nujineci/5/edit

答案 1 :(得分:5)

可能是因为在filter内使用ng-show,过滤器会在每个摘要周期中执行,并且不断检查您的值是否已更改,如果更改了值,则会再次计算并给出新结果,否则它什么都不做(因为angularJs使用“脏检查”方法来找到任何变化)

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

检查此链接,我已修改

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

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

ng-show="g.values.indexOf(g.value1) > -1" //这与上面相同

indexOf返回item的索引(如果存在于数组中),否则返回-1

我使用这种语法,从来没有遇到任何问题