【问题标题】:Angular scope function executed multiple times角度范围函数多次执行
【发布时间】:2013-06-18 08:37:39
【问题描述】:

我在作用域上定义了一个函数。当我从 {{}} 内部的视图中调用它时,它会执行 X 次。

控制器

function testCtrl($scope) {
   $scope.myFunc = function(name) {
       return "Hello " + name;
   }
}

HTML

<div>{{myFunc('Joe')}}</div>

你可以在这个例子中看到它:http://jsfiddle.net/rbRvD/2/

或使用 Plunker:http://plnkr.co/edit/LLQ7cKs2fEoBwv0C5XPE

我猜这是错误的方式,但是为什么它执行了这么多次?

【问题讨论】:

  • 用 plunker 链接更新
  • 你能说出你是如何跳过这个问题的吗?

标签: angularjs angularjs-scope


【解决方案1】:

您的函数运行了 10 次。为什么是10?为什么不是 100?

答案is in the docs

watch监听器可能会改变模型,这可能会触发其他 听众开火。这是通过重新运行观察者直到没有 检测到变化。 重新运行迭代限制为 10 以防止 无限循环死锁。

当您看到这种情况发生时,这意味着您正在更改模型,使得 Angular 必须重新运行摘要并再次触发监视。在您的特定情况下,您正在调用一个更新计数器的函数,该计数器显示在页面上。当计数器值发生变化时,它会再次运行摘要,它会调用更新计数器等的函数。

Angular 期望您(并且确实鼓励您)更改模型并让视图响应这些更改,而不是反过来。

【讨论】:

  • 在我的回复中错过了这部分...好吧,那我猜这不是问题吗?计数器只是一个更清楚的例子。有了日志,我想它会为每个观察者记录一次?
  • 有什么办法可以重新使用它?因为在应用程序中,我们总是使用一组属性来操纵值。例如全名 = FirstName + LastName,地址 = City + Pin。所有属性都是用户模型的一部分。现在如果城市改变了,不需要再次修改全名。这可能会导致性能不佳。
  • @Nitul 我已经有一段时间没有使用 Angular 了。我建议在另一个问题中问这个。
【解决方案2】:

这是预期的行为。 Angular 表达式 ({{expression}}) 在每个 $digest loop 上重新评估(有时每个循环多次)。这意味着表达式在计算方面应该保持简洁。

就此而言,表达式评估不应导致 AJAX 调用或其他一些密集或异步操作,或者如果必须,则不应缓存结果。

【讨论】:

  • zetetic 的回答在技术上是正确的,但它回答了问题,而不是这里发布的问题(它们是不同的)。此答案适用于此处发布的问题。
【解决方案3】:

AngularJs 不建议您在渲染时更改作用域的模型。如果您想更改作用域的模型,请在 Controller 或 Directive 中进行。

将视图视为仅显示数据(本例中为范围值)的地方,所有对数据的修改都应在Controller或Directive中。

【讨论】:

  • 如果你的意思是计数器值,它只是为了让我的例子更清楚。你可以把日志放在那里。
猜你喜欢
  • 2017-11-13
  • 2017-08-03
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多