角度范围功能多次执行

时间:2013-06-18 08:37:39

标签: angularjs angularjs-scope

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

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

3 个答案:

答案 0 :(得分:34)

您的功能运行10次。为什么10?为什么不100?

答案is in the docs

  

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

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

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

答案 1 :(得分:12)

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

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

答案 2 :(得分:1)

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

将视图视为仅显示数据的位置(在这种情况下为范围值),所有数据修改都应在Controller或Directive中。