AngularJS-ng显示使用方法不断调用



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

我的理解、我的实现是否有缺陷,或者这是否如预期的那样发挥作用,我不应该担心这些方法被不断调用会对性能产生任何负面影响?

方法(在CoffeeScript中)

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

带有ng的HTML标签显示

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

感谢您的任何见解=]

您的正确理解是,一旦摘要"稳定化",就会调用ng-show。然而,您可能无法理解的是,应用摘要周期可能是由许多事情触发的,因此您的ng show会多次被调用用于此范围。您可以调试并检查此作用域的apply/edigest的调用次数是否与ng-show的方法的调用次数一样多。不能保证只调用一次、两次或任何时间。一旦你的作用域触发了摘要/应用循环,你就会得到你的console.log。就这么简单。

当然,触发摘要/应用循环的原因可能有多种,但在我看来,如果你不触发浏览器事件、不重新加载或不做一些$timeout的事情,它最终应该停止。如果它不停止,那么你就在某个地方搞砸了。

我为你创建了一个Plunkr,这样你就可以检查在正常情况下,它会被调用一两次,如果你不采取行动,什么都不会发生。然而,如果你按下按钮,它会更新一个完全不同的作用域值,它会触发一个作用域摘要/应用周期,你会得到一个额外的控制台。log:

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

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

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

最新更新