当ng-repeat运行时,它将该数组的每个元素添加到一个独立的作用域中,同时使该数组本身在作用域中。这意味着$ digest检查整个数组的变化,最重要的是,它检查数组中的每个单独的元素的变化。
见this plunker作为我所说的例子。
在我的用例中,我从来没有改变我的数组的单个元素,所以我不需要让他们看。我将只更改整个数组,在这种情况下,ng-repeat将重新呈现它的整个表。 (如果我错了,请让我知道..)
在一个(比如说)1000行的数组中,还有1000个表达式,我不需要求值。
如何在观察主数组的同时从观察者注销每个元素?
也许而不是取消注册我可以有更多的控制我的$ digest,并以某种方式跳过每一行?
这种具体情况实际上是一个更普遍的问题的例子。我知道$watch returns a ‘deregisteration’ function,但这并没有帮助,当指令是注册手表,这是大部分时间。
你需要创建一个自定义指令,它接受一个参数和表达式到你的数组,然后在链接函数中你只是看着那个数组,你将有链接函数以编程方式刷新HTML(而不是使用ng重复)
类似(psuedo-code):
app.directive('leanRepeat',function() { return { restrict: 'E',scope: { 'data' : '=' },link: function(scope,elem,attr) { scope.$watch('data',function(value) { elem.empty(); //assuming jquery here. angular.forEach(scope.data,function(d) { //write it however you're going to write it out here. elem.append('<div>' + d + '</div>'); }); }); } }; });
…这似乎在屁股的痛苦。
替代性黑客方法
你可以循环遍历$ scope。$$ watchers并检查$ scope。$$ watchers [0] .exp.exp看看它是否匹配你想删除的表达式,然后用一个简单的splice )调用。 PITA在这里,是类似Blah {{whatever}}标签之间的Blah将是表达式,甚至包括回车。
在上面,你可能可以循环通过你的ng-repeat的$范围,只是删除一切,然后明确地添加你想要的手表…我dunno。
无论哪种方式,它似乎是一个黑客。
删除由$ scope。$ watch创建的监视器
您可以使用$ watch调用返回的函数取消注册$ watch:
例如,有一个$ watch只有一次fire:
var unregister = $scope.$watch('whatever',function(){ alert('once!'); unregister(); });
你可以,当然调用unregister函数任何时候你想…这只是一个例子。
结论:没有真正的伟大的方式来做你所要求的
但有一点需要考虑:它是否值得担心?此外,它真的是一个好主意有成千上万的记录加载到几十个DOMElements每个?食物思想。
我希望有所帮助。
编辑2(删除坏主意)