33

我在范围上定义了一个函数。当我从 {{}} 内部的视图中调用它时,它会执行 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

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

4

3 回答 3

36

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

答案在文档中

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

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

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

于 2013-06-19T06:14:59.420 回答
12

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

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

于 2013-06-19T06:09:40.130 回答
1

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

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

于 2013-06-19T06:33:02.707 回答