angular度范围函数执行多次

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

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

你的function运行10次。 为什么10? 为什么不是100?

答案在文档中 :

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

当你看到这种情况发生时,这意味着你正在改变模型,Angular必须重新运行摘要并重新启动手表。 在你的特定情况下,你正在调用一个函数来更新一个显示在页面上的计数器。 当计数器值改变时,再次运行摘要,调用更新计数器的函数等。

Angular希望(并且确实鼓励你)改变模型,让视图对这些改变做出反应,而不是相反。

这是预期的行为。 对每个$ digest循环重新评估angular度expression式( {{expression}} )(有时每个循环多次)。 这意味着expression式应该在计算方面保持轻微。

对于这个问题,expression式评估不应该导致AJAX调用或其他密集或asynchronous操作,或者如果必须的话,应该caching结果。

AngularJs不build议您在渲染时更改范围的模型。 如果你想改变示波器的模型,可以在Controller或者Directive中进行。

将视图视为显示数据的地方(在这种情况下是范围值),数据的所有修改都应该在控制器或指令中。