我想使用像values | filter:value1
这样的过滤器表达式来隐藏或显示div,其中values
和value
都在包含指令的链接函数的作用域中声明。
这种方式和预期的一样,只是它能够消除无限的摘要循环错误。
的示范看到这个jsbin:http://jsbin.com/nujineci/2/edit
我在做什么错?为什么在过滤器没有更新模型时会出现这些错误?
我想使用像values | filter:value1
这样的过滤器表达式来隐藏或显示div,其中values
和value
都在包含指令的链接函数的作用域中声明。
这种方式和预期的一样,只是它能够消除无限的摘要循环错误。
的示范看到这个jsbin:http://jsbin.com/nujineci/2/edit
我在做什么错?为什么在过滤器没有更新模型时会出现这些错误?
可能是因为在ng-show
里面使用了filter
,过滤器在每个摘要循环中被执行,并且保持检查你的值是否改变,如果值被改变,那么它再次评估并给出新结果,否则它不会做任何东西(becaues 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如果存在于阵列返回项的索引,否则返回-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;
当Angular的摘要循环第一次运行时,它会得到一个包含'bar'和一个空数组的数组。然后Angular会再次运行Digest循环来检查模型是否稳定。它会得到新的数组(实例),它会认为模型已经改变。这将导致另一个摘要循环,依此类推。
你应该检查你的数组是否包含值和ng-show。例如。 Determine whether an array contains a value
看看这个修改jsbin:http://jsbin.com/nujineci/5/edit