【问题标题】:Controller function gets called multiple times控制器函数被多次调用
【发布时间】:2015-04-18 15:58:22
【问题描述】:

我在 Google 和 StackOverflow 都做了一些研究,发现了几个类似的问题,但似乎都没有解决或解决我的具体情况。所以这是我的问题:

在我正在处理的一些代码中,我从我的 html 调用控制器函数,如下所示:

<div ng-controller="MyCtrl">
  <p>{{ myFunction() }}</p>
</div>

由于我在 myFunction 中进行了一些跟踪,我注意到该函数被调用了 4 次!

我在 JS Bin 创建了一个简约测试,这里:http://jsbin.com/nukuhemata/1/edit?html,js,console,output

在这个简化的测试中,我的函数被调用了 3 次(有一些进展;-)。如果我使用{{ ::test() }} 而不是{{ test() }},正如我在其他一些答案中所建议的那样,它只会被调用两次(更多进展)。

我是 Angular 的初学者,根据我的阅读,我认为这是正常的预期行为。是这样吗?如果是,为什么?如果不是,我的代码有什么问题?

【问题讨论】:

  • 您能再展示一些代码吗,尤其是您拥有的路由器和观察者?

标签: javascript angularjs


【解决方案1】:

这是正常现象,每次$digest循环运行时,都必须执行该函数来检查输出值是否发生变化,从而判断是否有新值可以更新DOM。

因此,最好在需要时从控制器更新$scope 上的值,并在标记中引用它。通常没有意义的差异,但如果您的函数正在为 ng-repeat 构建一个大数组,它可能会变得很重要。

编辑:请参阅function called multiple times from template 以获得更可靠的答案。

【讨论】:

  • 当然,我自己也遇到过很多次。这是 Angular 的最大缺点,它使用了大量的脏检查,并且意识到这一点对于保持应用程序的性能很重要。对于同一个问题,这个问题的答案会更深入一点:stackoverflow.com/questions/26508564/…
  • 非常感谢,知道这很正常,我松了一口气,一开始我快疯了。我必须阅读摘要循环才能理解为什么 Angular 需要经历多达 4 次。
  • 是的,了解$apply$digest 对于任何显着大小的应用程序都至关重要。这个特定问题的寓意是绑定{{test}} 而不是{{test()}},然后在您的控制器中仅在需要时更新test。直接绑定函数调用再好不过了,但有时考虑起来要容易得多。
猜你喜欢
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2020-11-27
相关资源
最近更新 更多