当角度范围函数只运行一次时执行两次?

时间:2013-11-15 04:00:49

标签: angularjs

Demo here

快速提问:在下面的代码中我只调用函数isSpecificPage()一次,为什么调用console.log两次?

<div ng-hide="isSpecificPage()">
  <p>Hello!</p>
</div>

2 个答案:

答案 0 :(得分:5)

Angular会对您的ng-hide函数进行监视,以便每个摘要周期都可以看到结果是否发生了变化(因此如果需要从隐藏更改为显示您的元素,反之亦然)。

当评估观察到的函数时(在$digest期间),如果它们中的任何一个已经从之前的$digest发生了变化,那么Angular知道这种变化可能会波及其他观察到的函数(也许改变的变量用于另一个看了功能)。因此,每个手表都会被重新评估(也称为脏处理),直到所有手表都没有变化。因此,通常情况下,每次摘要会看到2次调用观看函数的次数,有时甚至更多(通过它的10次循环最多10次放弃并报告错误,表示无法稳定)。

此处还有watchdigest

  

http://docs.angularjs.org/api/ng。$ rootScope.Scope

     

http://www.benlesh.com/2013/08/angularjs-watch-digest-and-apply-oh-my.html

答案 1 :(得分:-1)

ng-hide是内部使用$watch的指令之一。由于$watch使用摘要周期(至少运行2次以检查值是否已更改),因此您的函数isSpecificPage已运行两次。

有关在内部使用$watch的指令列表,请参阅此stackoverflow回答directives that add watch internally