AngularJS - ng-show使用方法连续调用

时间:2014-01-04 00:28:24

标签: angularjs

据我所知,与其他绑定一样,ng-show应该在摘要稳定后停止调用关联的方法。考虑到这一点,我希望看到以下console.log()两次。然而,它每秒记录一次。

我的理解是否有缺陷,我的实施,或者这是否按预期发挥作用,我不应该担心这些方法会不断被称为负面的性能影响?

方法(在CoffeeScript中)

$scope.showThis = ->
    console.log("foobar")
    true

带有ng-show的HTML标记

<div ng-show="showThis()">hey, you can see me!</div>

感谢您的任何见解=]

2 个答案:

答案 0 :(得分:7)

正确的理解是,一旦摘要“稳定”,就会调用ng-show。但是,您可能无法理解的是,应用摘要周期可能会被许多事情触发,因此您的ng-show将被多次调用此范围。您可以调试并检查此范围的apply / digest的调用次数与ng-show的方法完全相同。无法保证只应调用一次,两次或任何时间。只要在您的示波器上触发摘要/应用周期,您就会获得console.log。就这么简单。

当然,触发摘要/应用周期的原因可能是多次,但在我看来,如果你没有触发浏览器事件或者没有重新加载或者没有做一些超时的东西,它应该停止。如果它没有停止,那么你就搞砸了。

我为你创建了一个Plunkr,所以你可以在正常的情况下检查它,它会被调用一次或两次,如果你不对它采取行动,就没有任何反应。但是,如果您按下更新完全不同的范围值的按钮,则会触发范围摘要/应用周期,您将获得一个额外的console.log:

http://plnkr.co/edit/x9I6VGP8eXtLGmT1Cuqu?p=preview

答案 1 :(得分:2)

摘要循环的工作方式是每次调用$apply() or $digest()时,它将遍历所有设置的监视(指令中的表达式通常由监视器实现)。如果 ANY 手表被触发,那么它将再次通过所有手表。它将一次又一次地继续这样做,直到不再看到它或直到它经历了10个循环(此时它抛出异常并失败)。

大多数角度状态变化都会触发摘要周期(例如点击事物,更新输入值或其他事件)。您可以期望在应用程序的整个生命周期内多次调用手表,这就是为什么您需要确保不对其进行任何繁重的计算。