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

AngularJS过滤器触发无限$digest循环,angularjs,angularjs-directive,angularjs-filter,Angularjs,Angularjs Directive,Angularjs Filter,我想使用一个过滤器表达式,如values | filter:value1来隐藏或显示一个div,其中values和value都在包含指令的link函数的作用域上声明 这和预期的一样,只是它不断触发无限的摘要循环错误 有关演示,请参见此jsbin: 我做错了什么?当过滤器没有更新任何模型时,为什么会出现这些错误?可能是因为在ng show中使用了filter,过滤器在每个摘要周期中执行,并不断检查您的值是否更改,如果值更改,它将再次计算并给出新结果,否则它不会做任何事情(因为angularJs使用

我想使用一个过滤器表达式,如
values | filter:value1
来隐藏或显示一个div,其中
values
value
都在包含指令的link函数的作用域上声明

这和预期的一样,只是它不断触发无限的摘要循环错误

有关演示,请参见此jsbin:


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

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

检查此链接,我已修改

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

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

indexOf返回数组中存在的项的索引,否则返回
-1


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

问题的答案是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;
//还有一些代码
var筛选=[];
对于(var j=0;j
当Angular的摘要循环第一次运行时,它将获得一个包含“bar”和空数组的数组。然后Angular将再次运行摘要循环以检查模型是否稳定。它将获得新的数组(实例),并认为模型已更改。这将导致另一个摘要循环,依此类推

您应该检查您的数组是否包含值,并在该数组上显示ng。

查看这个修改过的jsbin:

// 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;