2014-03-25 34 views
5

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

这种方式和预期的一样,只是它能够消除无限的摘要循环错误。

的示范看到这个jsbin:http://jsbin.com/nujineci/2/edit

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

回答

5

可能是因为在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

我使用这种类型的语法,从来没有任何与此问题

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会再次运行Digest循环来检查模型是否稳定。它会得到新的数组(实例),它会认为模型已经改变。这将导致另一个摘要循环,依此类推。

你应该检查你的数组是否包含值和ng-show。例如。 Determine whether an array contains a value

看看这个修改jsbin:http://jsbin.com/nujineci/5/edit

相关问题