我想使用像values | filter:value1
这样的过滤器表达式来隐藏或显示div,其中values
和value
都在包含指令的链接中的范围内声明功能
这可以正常工作,除了它不断触发无限的摘要循环错误。
请参阅此jsbin进行演示:http://jsbin.com/nujineci/2/edit
我做错了什么?当过滤器没有更新模型时,为什么会出现这些错误?
答案 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
我使用这种语法,从来没有遇到任何问题