我已经在范围上定义了一个函数。当我从{{}}内的视图中调用它时,它会执行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
我想这是以错误的方式完成的,但为什么它会执行这么多次?
答案 0 :(得分:34)
您的功能运行10次。为什么10?为什么不100?
手表监听器可能会更改模型,这可能会触发其他模型 听众要开火。这是通过重新运行观察者直到没有 检测到更改。 重新运行迭代限制为10 以防止 无限循环死锁。
当您看到这种情况发生时,这意味着您正在更改模型,以便Angular必须重新运行摘要并再次触发监视。在您的特定情况下,您正在调用更新计数器的功能,该计数器显示在页面上。当计数器值改变时,它再次运行摘要,调用更新计数器等的函数,等等。
Angular希望您(并且确实鼓励您)更改模型并让视图响应这些更改,而不是相反。
答案 1 :(得分:12)
这是预期的行为。角度表达式({{expression}}
)在每个$digest loop上重新评估(有时每个循环多次)。这意味着表达式应该在计算方面保持清晰。
就此而言,表达式评估不应该导致AJAX调用或其他强化或异步操作,或者如果必须,那么应该缓存结果。
答案 2 :(得分:1)
AngularJs不建议您在渲染时更改范围的模型。如果您想更改示波器的型号,请在Controller或Directive中进行。
将视图视为仅显示数据的位置(在这种情况下为范围值),所有数据修改都应在Controller或Directive中。