角度范围功能多次执行

hes*_*esa 30 angularjs angularjs-scope

我已经在范围上定义了一个函数.当我从{{}}内的视图中调用它时,它会执行X次.

调节器

function testCtrl($scope) {
   $scope.myFunc = function(name) {
       return "Hello " + name;
   }
}
Run Code Online (Sandbox Code Playgroud)

HTML

<div>{{myFunc('Joe')}}</div>
Run Code Online (Sandbox Code Playgroud)

您可以在此示例中看到它:http://jsfiddle.net/rbRvD/2/

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

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

zet*_*tic 34

你的功能运行了10次.为什么10?为什么不100?

答案在文档中:

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

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

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


Ste*_*wie 12

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

就此而言,表达式评估不应该导致AJAX调用或其他强化或异步操作,或者如果必须,则应该缓存结果.